Thread

  1. Re: pg_plan_advice

    Jakub Wartak <jakub.wartak@enterprisedb.com> — 2025-12-10T11:43:39Z

    On Fri, Dec 5, 2025 at 8:57 PM Robert Haas <robertmhaas@gmail.com> wrote:
    [..]
    > 014f9a831a320666bf2195949f41710f970c54ad removes the need for what was
    > previously 0004, so here is a new patch series with that dropped, to
    > avoid confusing cfbot or human reviewers.
    
    Quick-question regarding cross-interactions of the extensions: would
    it be possible for auto_explain to have something like
    auto_explain.log_custom_options='PLAN_ADVICES' so that it could be
    dumping the advice of the queries involved . I can see there is
    ApplyExtensionExplainOption() and that would have to probably be used
    by auto_explain(?) Or is there any other better way or perhaps it
    somehow is against some design or it's just outside of initial scope?
    This would solve two problems:
    a) sometimes explaining manually (psql) is simply not realistic as it
    is being run by app only
    b) auto_explain could log nested queries and could print plan advices
    along the way, which can be very painful process otherwise
    (reverse-engineering how the optimizer would name things  in more
    complex queries run from inside PLPGSQL functions)
    
    BTW, some feedback: the plan advices (plan fixing) seems to work fine
    for nested queries inside PLPGSQL, and also I've discovered (?) that
    one can do even today with patchset the following:
       alter function blah(bigint) set pg_plan_advice.advice =
    'NESTED_LOOP_MATERIALIZE(b)';
    which seems to be pretty cool, because it allows more targeted fixes
    without even having capability of fixing plans for specific query_id
    (as discussed earlier).
    
    For the generation part, the only remaining thing is how it integrates
    with partitions (especially the ones being dynamically created/dropped
    over time). Right now one needs to keep the advice(s) in sync after
    altering the partitions, but it could be expected that some form of
    regexp/partition-templating would be built into pg_plan_advices
    instead. Anyway, I think this one should go into documentation just as
    known-limitations for now.
    
    While scratching my head on how to prove that this is not crashing
    I've also checked below ones (TLDR all ok):
    1. PG_TEST_INITDB_EXTRA_OPTS="-c
    shared_preload_libraries='pg_plan_advice'"  meson test  # It was clean
    2. PG_TEST_INITDB_EXTRA_OPTS="-c
    shared_preload_libraries='pg_plan_advice'" PGOPTIONS="-c
    pg_plan_advice.advice=NESTED_LOOP_MATERIALIZE(certainlynotused)" meson
    test # This had several failures, but all is OK: it's just some of
    them had to additional (expected) text inside regression.diffs:
    NESTED_LOOP_MATERIALIZE(certainlynotused) /* not matched */
    3. PG_TEST_INITDB_EXTRA_OPTS="-c
    shared_preload_libraries='pg_plan_advice' -c
    pg_plan_advice.shared_collection_limit=42"  meson test # It was clean
    too
    
    -J.