Questions about "Output" in EXPLAIN ANALYZE VERBOSE

From: Jerry Brenner <jbrenner(at)guidewire(dot)com>
To: pgsql-performance(at)lists(dot)postgresql(dot)org
Subject: Questions about "Output" in EXPLAIN ANALYZE VERBOSE
Date: 2024-01-02 18:28:31
Message-ID: CACoKFYSKJB3t-=8QLtaL1TvSOgu_XXHtk_mBMPpJu5Me7otQrA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

We are currently on 13.9. For each of the questions, I'd also like to know
if anything has changed in that area in later releases.
NOTE: We are capturing all explain plans via auto_explain and storing them
in a database table. One of our longer term goals is to build the
relationship between queries and indexes, so we can tell where each of the
indexes is used and how it is used (or not used). In the Index Only Scan
example below, we think that there are other queries that use the same
index AND also access JobID and MostRecentModel, but we want to verify that.

*Any node type accessing an index or table*

- It looks like "Output" includes more than just the columns with
predicates and/or being accessed or returned in other nodes. *Has any
thought been given to adding an additional attribute listing the columns
that are actually used?* (While it's possible to do this after getting
the explain plan, it seems like that information would be available
internally in Postgres.)

*Index Only Scan*

- *Is it safe to assume that the columns listed with "Output" in an
Index Only Scan node are the key columns, in order? * That's what we've
observed, but I wanted to check if it was safe to make that assumption.
- NOTE: IMHO, this is a case where showing all of the key columns,
instead of just the ones that are used, is helpful because the person
analyzing the query plan doesn't necessarily have direct access to the
database schema.
- In this example, policyperi_u_id_1mw8mh83lyyd9 is on
pc_policyperiod(ID, Retired, JobID, PolicyID, TemporaryBranch,
MostRecentModel)
- NOTE: PolicyID is referenced in a node above the Index Only Scan, but
neither JobID nor MostRecentModel are.

"Plans": [
{
"Node Type": "Index Only Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Scan Direction": "Forward",
"Index Name":
"policyperi_u_id_1mw8mh83lyyd9",
"Relation Name": "pc_policyperiod",
"Schema": "public",
"Alias": "qroots0_1",
"Startup Cost": 0.57,
"Total Cost": 15.90,
"Plan Rows": 10,
"Plan Width": 8,
"Actual Startup Time": 0.234,
"Actual Total Time": 1.223,
"Actual Rows": 203,
"Actual Loops": 1,
* "Output": ["qroots0_1.id
<http://qroots0_1.id>", "qroots0_1.retired", "qroots0_1.jobid",
"qroots0_1.policyid", "qroots0_1.temporarybranch",
"qroots0_1.mostrecentmodel"],*
"Index Cond": "((qroots0_1.id = ANY ($4))
AND (qroots0_1.retired = 0) AND (qroots0_1.temporarybranch = false))",

*Index Scan*

- *Is it safe to assume that the columns listed are all of the columns
in the table?* (The table has too many columns to verify.)

{
"Node Type": "Index Scan",
"Parent Relationship": "Inner",
"Parallel Aware": false,
"Scan Direction": "Forward",
"Index Name": "ppperf10",
"Relation Name": "pc_policyperiod",
"Schema": "public",
"Alias": "groot_1",
"Startup Cost": 485987.94,
"Total Cost": 485990.69,
"Plan Rows": 1,
"Plan Width": 16,
"Actual Startup Time": 5.710,
"Actual Total Time": 5.710,
"Actual Rows": 0,
"Actual Loops": 117,
* "Output": ["groot_1.paymentinstrument_wmic",
"groot_1.cipminretainedpremium_wmic", "groot_1.pendingreindex",
"groot_1.locked", "groot_1.editeffectivedate", "groot_1.invoicingmethod",
"groot_1.archivestate", "groot_1.archiveschemainfo",
"groot_1.prioraddressfk_ext", "groot_1.locationautonumberseq",
"groot_1.csioid_ext", "groot_1.updatetime",
"groot_1.multiproddiscapplied_wmic", "groot_1.paymentdesc_wmic",
"groot_1.id <http://groot_1.id>", "groot_1.singlecheckingpatterncode",
"groot_1.billingmethod", "groot_1.fleetdiscount_wmic",
"groot_1.createuserid", "groot_1.cp_auditwrapuplblty_wmic",
"groot_1.totalcostourshare", "groot_1.allowgapsbefore",
"groot_1.quoteidentifier", "groot_1.quotehidden", "groot_1.orphaned",
"groot_1.beanversion", "groot_1.packagediscount_wmic",
"groot_1.billtoescrow_wmic", "groot_1.insurerdenieddetail_wmic",
"groot_1.isprimarypayerremoved_wmic", "groot_1.branchname",
"groot_1.updateuserid", "groot_1.cancellationdate",
"groot_1.temporarybranch", "groot_1.segment", "groot_1.primaryinsuredname",
"groot_1.archivedentitypurgedate", "groot_1.showtaxexemption_wmic",
"groot_1.vestinginformation_wmic", "groot_1.depositoverridepct",
"groot_1.policytermid", "groot_1.othercurrentcarrier_wmic",
"groot_1.periodstart", "groot_1.livestockclaimscount_wmic",
"groot_1.selectedtermtype", "groot_1.claimsystemqueried_wmic",
"groot_1.publicid", "groot_1.cpprogramdetails_wmic",
"groot_1.commission_wmic", "groot_1.altbillingaccountnumber",
"groot_1.writtendate", "groot_1.totalcostrpt", "groot_1.totalcostrpt_cur",
"groot_1.ecollectanddistributedisc_wmic",
"groot_1.suppressdocdistribution_wmic", "groot_1.mostrecentmodel",
"groot_1.buildingclaimscount_wmic", "groot_1.ignorestatusforrequote_wmic",
"groot_1.fleetdiscountvalue_wmic", "groot_1.taxexemptionreason_wmic",
"groot_1.docpreferredlanguage_wmic", "groot_1.allocationofremainder",
"groot_1.overridebillingallocation", "groot_1.currentcarrier_wmic",
"groot_1.subscription_wmic", "groot_1.renewalsafterdefaulttrig_wmic",
"groot_1.archivefailuredetailsid", "groot_1.modeldate",
"groot_1.leadpolicynumber_wmic", "groot_1.brokerquotedpremium_wmic",
"groot_1.invoicestreamcode", "groot_1.frozensetid",
"groot_1.taxsurchargesrpt_cur", "groot_1.modelnumberindex",
"groot_1.basestate", "groot_1.machineryclaimscount_wmic",
"groot_1.quotedate_wmic", "groot_1.firstinsurance_wmic",
"groot_1.minimumpremium_wmic", "groot_1.mostrecentmodelindex",
"groot_1.archivepartition", "groot_1.taxexemptionnumber_wmic",
"groot_1.termtype_wmic", "groot_1.subscriptionourrole_wmic",
"groot_1.depositcollected", "groot_1.cp_auditbrannualrevenue_wmic",
"groot_1.failedooseevaluation", "groot_1.branchnumber",
"groot_1.transactioncostrpt", "groot_1.depositcollected_cur",
"groot_1.busopsdesc_wmic", "groot_1.transactioncostrpt_cur",
"groot_1.cipcommisionpercentage_wmic", "groot_1.basedonid",
"groot_1.archivedate", "groot_1.billimmediatelypercentage",
"groot_1.suppressformdistribution_wmic",
"groot_1.quotecloneoriginalperiod", "groot_1.depositamount",
"groot_1.periodend", "groot_1.preferredcoveragecurrency",
"groot_1.waivebrokerfees_wmic", "groot_1.preferredsettlementcurrency",
"groot_1.transactioncostrptci_ext_amt", "groot_1.persistency_wmic",
"groot_1.wasperiodquotedbeforeclosed", "groot_1.maturedriverdiscount_wmic",
"groot_1.basedondate", "groot_1.totalpremiumrpt",
"groot_1.totalpremiumrpt_cur", "groot_1.fullyretainedpremium_wmic",
"groot_1.nameofprincipals_wmic", "groot_1.validreinsurance",
"groot_1.seriescheckingpatterncode", "groot_1.taxexemption_wmic",
"groot_1.donotdestroy", "groot_1.pnicontactdenorm", "groot_1.editlocked",
"groot_1.quotematuritylevel", "groot_1.rateasofdate", "groot_1.jobid",
"groot_1.multiproddiscpolicy_wmic", "groot_1.uwcompany",
"groot_1.estimatedpremium", "groot_1.addfollowupnotes_wmic",
"groot_1.periodid", "groot_1.estimatedpremium_cur",
"groot_1.insurerdenied_wmic", "groot_1.assignedrisk",
"groot_1.transactionpremiumrpt", "groot_1.sourceofbusiness_wmic",
"groot_1.currentinceptiondate_wmic", "groot_1.excludereason",
"groot_1.accountorgtype_wmic", "groot_1.specialhandling",
"groot_1.temporaryclonestatus", "groot_1.transactionpremiumrpt_cur",
"groot_1.checknumber_wmic", "groot_1.isconsent_wmic",
"groot_1.certificatenumber", "groot_1.cipyearsofexperience_wmic",
"groot_1.archivefailureid", "groot_1.totalcostourshare_cur",
"groot_1.failedoosevalidation", "groot_1.retired",
"groot_1.personalinsuranceprogram", "groot_1.quotenumber_wmic",
"groot_1.preempted", "groot_1.futureperiods",
"groot_1.primaryinsurednamedenorm", "groot_1.brokerclientid_wmic",
"groot_1.modelnumber", "groot_1.cipolicytype_ext", "groot_1.termnumber",
"groot_1.waivedepositchange", "groot_1.producercodeofrecordid",
"groot_1.cp_auditbdlyinjurypropdmg_wmic", "groot_1.cp_renewalcount_wmic",
"groot_1.createtime", "groot_1.industrycode",
"groot_1.cipminretainedamount_wmic", "groot_1.describesourceofbus_wmic",
"groot_1.policyid", "groot_1.followupaltaccnum_wmic",
"groot_1.excludedfromarchive", "groot_1.followbillmethod_wmic",
"groot_1.csioagencyid_ext", "groot_1.currentpolicynumber_wmic",
"groot_1.taxsurchargesrpt", "groot_1.currentexpdate_wmic",
"groot_1.otherorgtypedescription_wmic", "groot_1.overrideprequal_wmic",
"groot_1.yearbusinessstarted_wmic", "groot_1.quoteclonesequencenumber",
"groot_1.lockingcolumn", "groot_1.refundcalcmethod", "groot_1.status",
"groot_1.totalpremiumcostourshare", "groot_1.transactioncostrptci_ext_cur",
"groot_1.totalpremiumcostourshare_cur", "groot_1.depositamount_cur",
"groot_1.commissionoverride_wmic", "groot_1.policynumber",
"groot_1.worksetuid", "groot_1.appeventsyncstatus",
"groot_1.isfacagreementadded_ext", "groot_1.bp_lockactive_ext"]*,
"Index Cond": "((groot_1.mostrecentmodel =
true) AND (groot_1.temporarybranch = false) AND (groot_1.retired = 0) AND
(groot_1.policyid = qroots0_1.policyid))",

Thanks,
Jerry

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Jeff Janes 2024-01-02 19:15:52 Re: Questions about "Output" in EXPLAIN ANALYZE VERBOSE
Previous Message mohini mane 2024-01-02 18:06:10 Re: Parallel hints in PostgreSQL with consistent perfromance