你能帮我解释一下psql的执行计划吗?我是一个java开发人员,而不是DB工程师,不能得到下面的内容。
我有一个很大的SQL(我猜实际的SQL并不是那么重要),但它的形式是
SELECT DISTINCT someFields
FROM (huge inner select)
ORDER BY someField
LIMIT 1000 OFFSET 0
我已经为请求制定了执行计划,并收到了以下计划:
Node Type: "Limit"
Startup Cost: 1281955.01 - here the same Cost as in Unique step
Total Cost: 1281960.45
Actual Startup Time: 218620.633 - this
Actual Total Time: 218630.771. - and this changed dramatically compared to previous step, while the Costs, almost not changed, why so?
Actual Rows: 93
Actual Loops: 1
- Node Type: "Unique"
Startup Cost: 1281955.01
Total Cost: 1281960.45
Actual Startup Time: 4000.387 - compared to this
Actual Total Time: 4010.517. - and this
Actual Rows: 93
Actual Loops: 1
- Node Type: "Sort"
Startup Cost: 1281955.01
Total Cost: 1281955.26
Actual Startup Time: 4000.380
Actual Total Time: 4010.420
Actual Rows: 93
Actual Loops: 1
...
then the costs and Time are moving in the same direction without spikes and big differences
...
JIT:
Worker Number: -1
Functions: 10479
Options:
Inlining: true
Optimization: true
Expressions: true
Deforming: true
Timing:
Generation: 2737.565
Inlining: 339.475
Optimization: 124066.840
Emission: 91849.576
Total: 218993.455
Execution Time: 221597.690
我感到困惑的是节点类型的“时间”(从4000.380到218620.633)中的巨大峰值:限制,但没有相同的尖峰成本(我想,也许我错了),他们是排序相同的值,但显示在不同的单位
这是postgres的正常行为吗,还是它向我展示了一些奇怪的事情?
我假设我的问题是限制步骤,它增加了214秒的处理时间。因此,我试图从查询中删除LIMIT,但它没有帮助,所以我有点困惑这个尖峰意味着什么,以及如何插入它。
谢谢你。
1条答案
按热度按时间oogrdqng1#
JIT几乎占用了该查询的所有时间,并且它所花费的时间完全解释了“Unique”和“Limit”之间实际启动时间差距。我不知道为什么差距会出现在计划中那个不直观的地方,但是当涉及到JIT时,奇怪是正常的。把jit关掉。如果你不能让你的DBA在服务器范围内关闭它,你至少可以只为你自己的用户关闭它:
(这将在您下次注销并重新登录时生效)