cockroach
cockroach copied to clipboard
release-24.1: sql: implement generic query plans
Backport:
- 1/1 commits from "sql: add plan_cache_mode session setting" (#125708)
- 2/2 commits from "opt: add ConvertSelectWithPlaceholdersToJoin exploration rule" (#125795)
- 2/2 commits from "opt: improve stats for filters with placeholder equalities" (#125808)
- 1/1 commits from "opt: add generic query plan tests with partial indexes" (#125871)
- 3/3 commits from "sql: implement plan_cache_mode=force_generic_plan" (#126528)
- 1/2 commits from "sql: implement plan_cache_mode=auto" (#126863)
- 2/2 commits from "opt: optimize generic query plans with stable expressions" (#125814)
- 1/1 commits from "sql: require an enterprise license to use generic query plans" (#127214)
- 1/1 commits from "sql: add telemetry counters for generic query plans" (#127897)
Please see individual PRs for details.
/cc @cockroachdb/release
Release justification: New feature gated behind session setting.
Thanks for opening a backport.
Please check the backport criteria before merging:
- [ ] Backports should only be created for serious issues or test-only changes.
- [ ] Backports should not break backwards-compatibility.
- [ ] Backports should change as little code as possible.
- [ ] Backports should not change on-disk formats or node communication protocols.
- [ ] Backports should not add new functionality (except as defined here).
- [ ] Backports must not add, edit, or otherwise modify cluster versions; or add version gates.
- [ ] All backports must be reviewed by the owning areas TL. For more information as to how that review should be conducted, please consult the backport policy.
If your backport adds new functionality, please ensure that the following additional criteria are satisfied:
- [ ] There is a high priority need for the functionality that cannot wait until the next release and is difficult to address in another way.
- [ ] The new functionality is additive-only and only runs for clusters which have specifically “opted in” to it (e.g. by a cluster setting).
- [ ] New code is protected by a conditional check that is trivial to verify and ensures that it only runs for opt-in clusters. State changes must be further protected such that nodes running old binaries will not be negatively impacted by the new state (with a mixed version test added).
- [ ] The PM and TL on the team that owns the changed code have signed off that the change obeys the above rules.
- [ ] Your backport must be accompanied by a post to the appropriate Slack channel (#db-backports-point-releases or #db-backports-XX-X-release) for awareness and discussion.
Also, please add a brief release justification to the body of your PR to justify this backport.
Your pull request contains more than 1000 changes. It is strongly encouraged to split big PRs into smaller chunks.
:owl: Hoot! I am a Blathers, a bot for CockroachDB. My owner is dev-inf.
I know this PR was big. I thought backporting everything in bulk would be nice, but I'm happy to backport one PR at a time if that's easier on everyone else.
Great work!! I didn't review all the code in detail since I think the original PR was reviewed carefully, but I did add a couple suggestions for things that might need a setting.
@rytaft I don't see your suggestions. Did you forget to publish them?
I've added one of the commits from #129050.
pkg/sql/plan_opt.go line 575 at r9 (raw file):
Previously, DrewKimball (Drew Kimball) wrote…
Would it ever be possible to have a stale fully optimized plan and non-stale generic plan? Or similar for a generic plan and a normalized plan.
Yes, I think both are possible. I intended to handle these cases with this logic. Is there something wrong you see?
pkg/sql/plan_opt.go line 575 at r9 (raw file):
Previously, DrewKimball (Drew Kimball) wrote…
Well if we do have a stale fully-optimized plan, shouldn't we return nil and build a new one, rather than resorting to a generic memo?
That should never be possible. If the query has no placeholders or stable functions, then we'll never generate a generic memo, so it'll always be nil.
I think a lot of this confusion will be cleared up as I refactor this logic such that all fully-optimized plans are "generic", and the other cached plan is "normalized" or a "base" memo that still needs to be optimized. The main reason I didn't structure things like that form the get-go is because it would have made these backports more risky.
TFTRs!