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