Can you consider adding an attribute to the explain plan json in a future release (to plan?) to denote if the plan is a "custom" vs "generic" plan? The use of $N variables for both parameter markers and InitPlan and SubPlan makes it harder to programmatically determine the type of plan (and in our case tell if 2 plans only differ by "custom" vs "generic").
We use numeric constants in our queries in a small number of cases where we know that there's no potential PII, there's a small number of values and that there's a high probability that the data is skewed. pc_message contains messages to be sent to external systems and hence is a volatile table and the data in the DestinationID column can be highly skewed. In theory, could using a constant instead of a bind variable for this predicate help the optimizer? Thanks, Jerry On Fri, Dec 8, 2023 at 5:04 PM Jerry Brenner <jbren...@guidewire.com> wrote: > Thanks for the quick response! That was very helpful! > My impression is that almost all of the plans being captured are > "custom", but now I know that I need to look closer. We also store the > execution times, so we can look at the execution order for queries that are > executed often enough to seem like they should stay in the cache. The > addition of the new timestamp columns in pg_stat_statements in 17 will also > help us get a better sense of how long the query had been in the cache. > > On Fri, Dec 8, 2023 at 4:44 PM Tom Lane <t...@sss.pgh.pa.us> wrote: > >> Jerry Brenner <jbren...@guidewire.com> writes: >> > We are currently on 13. We are capturing the explain plans for query >> > executions taking 1 second or longer and storing the json files. We are >> > most of the way through implementing a home grown solution to generate a >> > consistent hash value for a query plan, so we can find queries with >> > multiple plans. I've attached 2 query plans that we've captured that >> > differ in a seemingly strange way. (All executions are from the same >> exact >> > code path.) One of the plans has parameter markers in the predicates in >> > the values for "Recheck Cond" and "Index Cond", while the other does >> not. >> > Any insight into why we are seeing parameter markers in the body of the >> > query plan? >> >> The one with parameter markers is a "generic" plan for a parameterized >> query. When you get a plan without parameter markers for the same >> input query, that's a "custom" plan in which concrete values of the >> parameters have been substituted, possibly allowing const-simplification >> and more accurate rowcount estimates. The backend will generally try >> custom plans a few times and then try a generic plan to see if that's >> meaningfully slower -- if not, replanning each time is deemed to be >> wasteful. >> >> regards, tom lane >> >>