В этот раз хочу чуть более подробно посмотреть на отладочные параметры, с помощью которых можно получить много информации, связанной с выполнением запросов в PostgreSQL:
- debug_print_parse;
- debug_print_rewritten;
- debug_print_plan;
Конфигурационные параметры PostgreSQL лежат в каталоге с данными (PGDATA) в файле postgresql.conf. Все три параметра очень похожи:
- Раздел: Регистрация ошибок и протоколирование работы сервера / Что протоколировать
- Изменение: user, пользователи могут менять значение для своего сеанса (командой SET)
- Принимаемое значение: boolean
- Значение по умолчанию: false
Посмотреть можно стандартными способами:
SHOW debug_print_parse; SHOW debug_print_rewritten; SHOW debug_print_plan;
Либо запросом:
SELECT * FROM pg_settings WHERE name LIKE 'debug_print%';
Эти параметры позволяют получить:
- debug_print_parse — дерево синтаксического разбора;
- debug_print_rewritten — трансформированное дерево;
- debug_print_plan — дерево плана.
Подробно про этапы выполнения запросов рекомендую почитать в статьей Егора Рогова.
А я тут приведу содержимое логов, если включить эти параметры. Для этого я создал простейшее представление:
CREATE VIEW v_test AS SELECT 1;
И выполнил такой запрос:
SELECT * FROM v_test;
Получилось так:
2021-12-11 20:18:10.294 MSK [40460] postgres@demo LOG: parse tree: 2021-12-11 20:18:10.294 MSK [40460] postgres@demo DETAIL: {QUERY :commandType 1 :querySource 0 :canSetTag true :utilityStmt <> :resultRelation 0 :hasAggs false :hasWindowFuncs false :hasTargetSRFs false :hasSubLinks false :hasDistinctOn false :hasRecursive false :hasModifyingCTE false :hasForUpdate false :hasRowSecurity false :cteList <> :rtable ( {RTE :alias <> :eref {ALIAS :aliasname v_test :colnames ("?column?") } :rtekind 0 :relid 631945 :relkind v :rellockmode 1 :tablesample <> :lateral false :inh true :inFromCl true :requiredPerms 2 :checkAsUser 0 :selectedCols (b 8) :insertedCols (b) :updatedCols (b) :extraUpdatedCols (b) :securityQuals <> } ) :jointree {FROMEXPR :fromlist ( {RANGETBLREF :rtindex 1 } ) :quals <> } :targetList ( {TARGETENTRY :expr {VAR :varno 1 :varattno 1 :vartype 23 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnosyn 1 :varattnosyn 1 :location 7 } :resno 1 :resname ?column? :ressortgroupref 0 :resorigtbl 631945 :resorigcol 1 :resjunk false } ) :override 0 :onConflict <> :returningList <> :groupClause <> :groupingSets <> :havingQual <> :windowClause <> :distinctClause <> :sortClause <> :limitOffset <> :limitCount <> :limitOption 0 :rowMarks <> :setOperations <> :constraintDeps <> :withCheckOptions <> :stmt_location 0 :stmt_len 21 }
2021-12-11 20:19:36.422 MSK [40460] postgres@demo LOG: rewritten parse tree: 2021-12-11 20:19:36.422 MSK [40460] postgres@demo DETAIL: ( {QUERY :commandType 1 :querySource 0 :canSetTag true :utilityStmt <> :resultRelation 0 :hasAggs false :hasWindowFuncs false :hasTargetSRFs false :hasSubLinks false :hasDistinctOn false :hasRecursive false :hasModifyingCTE false :hasForUpdate false :hasRowSecurity false :cteList <> :rtable ( {RTE :alias <> :eref {ALIAS :aliasname v_test :colnames ("?column?") } :rtekind 1 :subquery {QUERY :commandType 1 :querySource 0 :canSetTag true :utilityStmt <> :resultRelation 0 :hasAggs false :hasWindowFuncs false :hasTargetSRFs false :hasSubLinks false :hasDistinctOn false :hasRecursive false :hasModifyingCTE false :hasForUpdate false :hasRowSecurity false :cteList <> :rtable ( {RTE :alias {ALIAS :aliasname old :colnames <> } :eref {ALIAS :aliasname old :colnames ("?column?") } :rtekind 0 :relid 631945 :relkind v :rellockmode 1 :tablesample <> :lateral false :inh false :inFromCl false :requiredPerms 2 :checkAsUser 0 :selectedCols (b 8) :insertedCols (b) :updatedCols (b) :extraUpdatedCols (b) :securityQuals <> } {RTE :alias {ALIAS :aliasname new :colnames <> } :eref {ALIAS :aliasname new :colnames ("?column?") } :rtekind 0 :relid 631945 :relkind v :rellockmode 1 :tablesample <> :lateral false :inh false :inFromCl false :requiredPerms 0 :checkAsUser 10 :selectedCols (b) :insertedCols (b) :updatedCols (b) :extraUpdatedCols (b) :securityQuals <> } ) :jointree {FROMEXPR :fromlist <> :quals <> } :targetList ( {TARGETENTRY :expr {CONST :consttype 23 :consttypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :location -1 :constvalue 4 [ 1 0 0 0 0 0 0 0 ] } :resno 1 :resname ?column? :ressortgroupref 0 :resorigtbl 0 :resorigcol 0 :resjunk false } ) :override 0 :onConflict <> :returningList <> :groupClause <> :groupingSets <> :havingQual <> :windowClause <> :distinctClause <> :sortClause <> :limitOffset <> :limitCount <> :limitOption 0 :rowMarks <> :setOperations <> :constraintDeps <> :withCheckOptions <> :stmt_location -1 :stmt_len 30 } :security_barrier false :lateral false :inh false :inFromCl true :requiredPerms 0 :checkAsUser 0 :selectedCols (b) :insertedCols (b) :updatedCols (b) :extraUpdatedCols (b) :securityQuals <> } ) :jointree {FROMEXPR :fromlist ( {RANGETBLREF :rtindex 1 } ) :quals <> } :targetList ( {TARGETENTRY :expr {VAR :varno 1 :varattno 1 :vartype 23 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnosyn 1 :varattnosyn 1 :location 7 } :resno 1 :resname ?column? :ressortgroupref 0 :resorigtbl 631945 :resorigcol 1 :resjunk false } ) :override 0 :onConflict <> :returningList <> :groupClause <> :groupingSets <> :havingQual <> :windowClause <> :distinctClause <> :sortClause <> :limitOffset <> :limitCount <> :limitOption 0 :rowMarks <> :setOperations <> :constraintDeps <> :withCheckOptions <> :stmt_location 0 :stmt_len 21 } )
2021-12-11 20:22:01.242 MSK [40460] postgres@demo LOG: plan: 2021-12-11 20:22:01.242 MSK [40460] postgres@demo DETAIL: {PLANNEDSTMT :commandType 1 :queryId 0 :hasReturning false :hasModifyingCTE false :canSetTag true :transientPlan false :dependsOnRole false :parallelModeNeeded false :jitFlags 0 :planTree {RESULT :startup_cost 0.00 :total_cost 0.01 :plan_rows 1 :plan_width 4 :parallel_aware false :parallel_safe false :plan_node_id 0 :targetlist ( {TARGETENTRY :expr {CONST :consttype 23 :consttypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :location -1 :constvalue 4 [ 1 0 0 0 0 0 0 0 ] } :resno 1 :resname ?column? :ressortgroupref 0 :resorigtbl 631945 :resorigcol 1 :resjunk false } ) :qual <> :lefttree <> :righttree <> :initPlan <> :extParam (b) :allParam (b) :resconstantqual <> } :rtable ( {RTE :alias <> :eref {ALIAS :aliasname v_test :colnames ("?column?") } :rtekind 1 :subquery <> :security_barrier false :lateral false :inh false :inFromCl true :requiredPerms 0 :checkAsUser 0 :selectedCols (b) :insertedCols (b) :updatedCols (b) :extraUpdatedCols (b) :securityQuals <> } {RTE :alias {ALIAS :aliasname old :colnames <> } :eref {ALIAS :aliasname old :colnames ("?column?") } :rtekind 0 :relid 631945 :relkind v :rellockmode 1 :tablesample <> :lateral false :inh false :inFromCl false :requiredPerms 2 :checkAsUser 0 :selectedCols (b 8) :insertedCols (b) :updatedCols (b) :extraUpdatedCols (b) :securityQuals <> } {RTE :alias {ALIAS :aliasname new :colnames <> } :eref {ALIAS :aliasname new :colnames ("?column?") } :rtekind 0 :relid 631945 :relkind v :rellockmode 1 :tablesample <> :lateral false :inh false :inFromCl false :requiredPerms 0 :checkAsUser 10 :selectedCols (b) :insertedCols (b) :updatedCols (b) :extraUpdatedCols (b) :securityQuals <> } {RTE :alias <> :eref {ALIAS :aliasname *RESULT* :colnames <> } :rtekind 8 :lateral false :inh false :inFromCl false :requiredPerms 0 :checkAsUser 0 :selectedCols (b) :insertedCols (b) :updatedCols (b) :extraUpdatedCols (b) :securityQuals <> } ) :resultRelations <> :rootResultRelations <> :appendRelations <> :subplans <> :rewindPlanIDs (b) :rowMarks <> :relationOids (o 631945 631945) :invalItems <> :paramExecTypes <> :utilityStmt <> :stmt_location 0 :stmt_len 21 }
Нда, очень информации для крошечного запроса без таблицы. Кое-что из неё можно понять, можете поразбираться 🙂
Leave a Reply