Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 为什么我做左连接时不应用优化?_Postgresql_Postgresql Performance - Fatal编程技术网

Postgresql 为什么我做左连接时不应用优化?

Postgresql 为什么我做左连接时不应用优化?,postgresql,postgresql-performance,Postgresql,Postgresql Performance,为什么列不向下推,并且未应用优化。 并在 当我使用整排变量时出现了问题。但在这里我不使用它们。 当我执行左连接或将此左连接放在CTE中时,查询运行缓慢 当我直接运行查询或将条件放入其中时,只需运行: 准备好 选择 协议id、系统周期、应用周期、, acc_i.ready作为acc_i_ready, acc_i.acc_期间作为acc_i_期间, acc_i.consumed_period作为acc_i_consumed_period, acc__.ready作为acc___.ready, acc

为什么列不向下推,并且未应用优化。 并在

当我使用整排变量时出现了问题。但在这里我不使用它们。 当我执行左连接或将此左连接放在CTE中时,查询运行缓慢

当我直接运行查询或将条件放入其中时,只需运行:

准备好 选择 协议id、系统周期、应用周期、, acc_i.ready作为acc_i_ready, acc_i.acc_期间作为acc_i_期间, acc_i.consumed_period作为acc_i_consumed_period, acc__.ready作为acc___.ready, acc_.acc_期间作为acc_期间, acc_.consumed_期间与acc___.consumed_期间相同 从订单 左连接acc_就绪“发票”,应用期,o acc_i上的acc_i就绪 左连接acc_就绪‘使用’、应用程序周期、o acc_ON acc_就绪 其中o.sys_period@>sys_time和o.app_period&&app_period 和协议_id=1736 选择* 准备就绪 当我在外面重复这个条件的时候

准备好 选择 协议id、系统周期、应用周期、, acc_i.ready作为acc_i_ready, acc_i.acc_期间作为acc_i_期间, acc_i.consumed_period作为acc_i_consumed_period, acc__.ready作为acc___.ready, acc_.acc_期间作为acc_期间, acc_.consumed_期间与acc___.consumed_期间相同 从订单 左连接acc_就绪“发票”,应用期,o acc_i上的acc_i就绪 左连接acc_就绪‘使用’、应用程序周期、o acc_ON acc_就绪 其中o.sys_period@>sys_time和o.app_period&&app_period 和协议_id=1736 选择* 准备就绪 -注意:我只重复这个! 其中sys_period@>sys_time和app_period&&app_period 和协议_id=1736 当我拆分条件时,需要:

准备好 选择 协议id、系统周期、应用周期、, acc_i.ready作为acc_i_ready, acc_i.acc_期间作为acc_i_期间, acc_i.consumed_period作为acc_i_consumed_period, acc__.ready作为acc___.ready, acc_.acc_期间作为acc_期间, acc_.consumed_期间与acc___.consumed_期间相同 从订单 左连接acc_就绪“发票”,应用期,o acc_i上的acc_i就绪 左连接acc_就绪‘使用’、应用程序周期、o acc_ON acc_就绪 其中o.sys_period@>sys_time和o.app_period&&app_period 选择* 准备就绪 哪里 协议id=1736-不幸的是,这不用于索引扫描=为什么??? 当我将所有条件移到外部时,已经需要: 嗯,但我不会崩溃,是吗

准备好 选择 协议id、系统周期、应用周期、, acc_i.ready作为acc_i_ready, acc_i.acc_期间作为acc_i_期间, acc_i.consumed_period作为acc_i_consumed_period, acc__.ready作为acc___.ready, acc_.acc_期间作为acc_期间, acc_.consumed_期间与acc___.consumed_期间相同 从订单 左连接acc_就绪“发票”,应用期,o acc_i上的acc_i就绪 左连接acc_就绪‘使用’、应用程序周期、o acc_ON acc_就绪 选择* 准备就绪 其中sys_period@>sys_time和app_period&&app_period 和协议_id=1736 当我删除左连接只需要

准备好 选择 协议id、系统周期、应用周期 从订单 选择* 准备就绪 其中sys_period@>sys_time和app_period&&app_period 和协议_id=1736 比较:VS VS 在depesz上相同:VS VS

为什么第二、第三和第四个查询没有像第一个/最后一个查询那样优化? 第四种情况是否有一些变通办法使其快速工作? 要选择邮件列表中描述的其他字段,请参见上面的链接

第二种情况在我看来是违反直觉的,不是预期的行为

服务器版本是13.1

*第一个-条件仅在CTE内时 *第二-当此条件复制到CTE外部时

UPD进一步调查:

试试I1

这里,当函数在第一种和第二种情况下不稳定时,BitmapHeapScan应用于两个索引: 订单id协议id,订单id系统周期应用周期不包括

VS

试试I2

将acc_就绪功能更改为稳定后, 对于第一个查询,使用BitmapHeapScan。 对于第二个查询,IndexScan被错误地使用了?。 比较

这里我们看到内联为我们节省了2ms 和34ms,因为没有JIT生成。 但还是错误地需要额外4ms?当我在外面重复这种情况

在这里,我不期望额外的4ms时间,因为CTE内部的条件是不变的,所以时间也不应该有变化,对吗

试试I3

最后,当我删除order_id_sys_period_app_period_excl索引时,会再次使用BitmapHeapScan而不是较慢的索引Scan。 这是最快速的查询,只需

尚待解答的问题: 为什么IndexScan用于I2部分而BitmapHeapScan用于I1部分? 为什么BitMapIndexScan不像在I3节中那样一个接一个地应用?最快案例<
/p> 多亏了IRC的RhodiumToad:

一,。未应用优化,因为CTE包含易失性函数。 它已经准备好了

二,。对于第二个查询,额外的时间需要JIT生成。 比较