Re: WIP: Faster Expression Processing v4
Andres Freund <andres@anarazel.de>
From: Andres Freund <andres@anarazel.de>
To: Peter Eisentraut <peter.eisentraut@2ndquadrant.com>
Cc: pgsql-hackers@postgresql.org, Heikki Linnakangas <hlinnaka@iki.fi>, Doug Doole <ddoole@salesforce.com>
Date: 2017-03-10T19:40:21Z
Lists: pgsql-hackers
On 2017-03-10 09:00:14 -0500, Peter Eisentraut wrote: > I have also looked at the 0002 and 0003 patches, and they seem OK, but > they are obviously not of much use without 0004. What is your ambition > for getting 0004 reviewed and committed for PG10? I'd really like to get it in. The performance improvements on its own are significant, and it provides the basis for significantly larger improvements again (JIT) - those followup improvements are large patches again though, so I'd rather not do all of that next cycle. My next step (over the weekend) is to add tests to execQual.c to get it a good chunk closer to 100% test coverage, and then do the same for the new implementation (there's probably very little additional tests needed after the conversion). Given all tests pass before/after, and there's a lot of them, I think we can have a reasonable confidence of a low bug density. Large parts of the changes are fairly mechanical, the interesting bits probably are: - there's a lot fewer "full blown" node types for expression evaluation anymore. In most cases there's now only a top-level ExprState node that's nodeTag() able. The actual information to execute an instruction now is in ExprState->steps[i] - because of the previous point, it now isn't legal anymore to call ExecInitExpr() on a list of expressions - ExecInitExprList() is a convenience wrapper around manually iterating over the list (gets rid of ugly casts, too) - Because they behave differently on an actual expression evaluation basis, quals / check constraint, now have to be initialized with ExecInitQual/ExecInitCheck(). That way the shortcut behaviour and such can be retained, while also being faster. - PlanState->targetlist is gone. Because expressions aren't initialized on their own anymore, but as part of ExecProject, there's no need for it. - The seperation between ExecInitExprRec() and ExecEvalExpr/ExecInterpExpr() is different - we try to do as much as possible during initialization. - I retained some ugly hackering around innermost_caseval|null/domainval|null - I had started down a path of removing the use of those in random parts of the system, but I ended up not going for it. Greetings, Andres Freund
Commits
-
Improve performance of ExecEvalWholeRowVar.
- 2f0903ea1965 10.0 landed
-
Remove unreachable code in expression evaluation.
- ad46a2aa79f9 10.0 landed
-
Faster expression evaluation and targetlist projection.
- b8d7f053c5c2 10.0 landed
-
Avoid syntax error on platforms that have neither LOCALE_T nor ICU.
- 457a44487328 10.0 cited
-
Add configure test to see if the C compiler has gcc-style computed gotos.
- bc18126a6bcb 10.0 landed
-
Improve regression test coverage for TID scanning.
- be6c3d19fd45 10.0 landed
-
Improve expression evaluation test coverage.
- ce38949ba23a 10.0 landed
-
Fix two errors with nested CASE/WHEN constructs.
- f0c7b789ab12 9.6.0 cited