Hi Henry,

I was under the impression that an EVAL calls the same compiler
that an I-type does, and that any expression optimization would be
done therein.

As far as I know, EVAL does indeed call the same compiler. As I think you realise, the point is that an I-type expression such as
  1: I
  2: SPACE(3)
(which I have seen used to get differing column spacings) will compile to a pcode sequence that produces a string of three spaces. This does not tell us how the query processor will then go on to use it. A "normal" I-type expression, whether from the dictionary or from use of EVAL, would be executed for each occurrence of it in the report, typically once per record. In the case of my spacing expression above, the query processor would actually only need to evaluate the expression once and then drop it into the report as a constant item.

I think that this is what the original poster was asking about. I have no idea whether UV does this (QM does). Your experiment seems to tell us.....

Here are some empirical results using UniVerse 10.2.7:

TIMEIT 50 COUNT VOC WITH F1 = 'V'
COUNT VOC WITH F1 = 'V'
Elapsed 1.3006

TIMEIT 50 COUNT VOC WITH F1 = EVAL "'V'"
COUNT VOC WITH F1 = EVAL "'V'"
Elapsed 5.135

This suggests that the query processor does not detect that the result of
the evaluation is a constant and optimize its execution.

No, I think that this is actually showing the opposite. The query was considerably faster where your test was a simple literal
  WITH F1 = 'V'
whereas the EVAL expression added a further four seconds to your query. If the query processor detected that
  EVAL "'V'"
was a constant and optimised it I would expect both queries to take the same time. It does look as though it is evaluating the expression for every record.


Martin Phillips
Ladybridge Systems Ltd
17b Coldstream Lane, Hardingstone, Northampton, NN4 6DB
+44-(0)1604-709200
_______________________________________________
U2-Users mailing list
[email protected]
http://listserver.u2ug.org/mailman/listinfo/u2-users

Reply via email to