在postgres中,我想知道生成计划所需的时间。我知道\时间给了我在找到最佳计划后执行计划所花费的时间。但我想找出postgres找出最佳计划的时间。是否有可能在postgres中确定这个时间。如果是,那怎么办?
同时查询计划生成器有时找不到最佳计划。我可以强制postgres使用最佳计划生成计划。如果是,那我该怎么办?
答案 0 :(得分:1)
对于准备计划所花费的时间和执行计划所花费的时间,您可以使用explain(仅查找计划)与解释分析(实际运行它)并启用\ timing:
test=# explain select * from test where val = 1 order by id limit 10;
QUERY PLAN
--------------------------------------------------------------------------------
Limit (cost=0.00..4.35 rows=10 width=8)
-> Index Scan using test_pkey on test (cost=0.00..343.25 rows=789 width=8)
Filter: (val = 1)
(3 rows)
Time: 0.759 ms
test=# explain analyze select * from test where val = 1 order by id limit 10;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..4.35 rows=10 width=8) (actual time=0.122..0.170 rows=10 loops=1)
-> Index Scan using test_pkey on test (cost=0.00..343.25 rows=789 width=8) (actual time=0.121..0.165 rows=10 loops=1)
Filter: (val = 1)
Rows Removed by Filter: 67
Total runtime: 0.204 ms
(5 rows)
Time: 1.019 ms
请注意,两个命令实际输出计划的开销很小。
通常它会发生,例如在DB2中,由于找到最佳计划需要花费大量时间。因此,数据库引擎决定使用次优计划......我认为必须与postgres一起使用。
在Postgres中,只有当您的查询足够残忍以至于无法合理地进行详尽搜索时,才会出现这种情况。当您达到相关阈值(如果您的用例是典型的那样很高时),计划程序将使用遗传查询优化器:
http://www.postgresql.org/docs/current/static/geqo-pg-intro.html
如果是,那么我如何摆弄postgres,以便选择最佳计划。
在更一般的用例中,有很多东西可以摆弄,但要非常小心搞乱它们(或许,除了使用ALTER TABLE SET STATISTICS
收集更多关于选定的几列的统计数据) :
http://www.postgresql.org/docs/current/static/runtime-config-query.html