PostgreSQL. debug_print_*

PostgreSQLВ этот раз хочу чуть более подробно посмотреть на отладочные параметры, с помощью которых можно получить много информации, связанной с выполнением запросов в 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;

Получилось так:

debug_print_parse:

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
	   }

[свернуть]
debug_print_rewritten:

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
	   }
	)

[свернуть]
debug_print_plan:

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
	   }

[свернуть]

Нда, очень информации для крошечного запроса без таблицы. Кое-что из неё можно понять, можете поразбираться 🙂


Be the first to comment

Leave a Reply

Ваш Mail не будет опубликован.


*