postgresql psql执行计划解释,时间峰值与成本比较(无峰值)

eyh26e7m  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(187)

你能帮我解释一下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,但它没有帮助,所以我有点困惑这个尖峰意味着什么,以及如何插入它。
谢谢你。

oogrdqng

oogrdqng1#

JIT几乎占用了该查询的所有时间,并且它所花费的时间完全解释了“Unique”和“Limit”之间实际启动时间差距。我不知道为什么差距会出现在计划中那个不直观的地方,但是当涉及到JIT时,奇怪是正常的。把jit关掉。如果你不能让你的DBA在服务器范围内关闭它,你至少可以只为你自己的用户关闭它:

alter user your_name_here set jit = off;

(这将在您下次注销并重新登录时生效)

相关问题