Zac*_*ith 5 postgresql sql-server optimization cte
除了“它发生”之外,我对任何数据库中的查询优化都没有清楚的了解。现在我刚刚看到了一篇“中等”的帖子,它讨论了在优化方面使用 PostgreSQL CTE 的陷阱,因为 CTE 只评估一次,并且任何可能在 CTE 使用方式、数据库方面应用的优化就是不能申请。
但是博客文章中的示例似乎很容易优化 - 即
SELECT * FROM foo WHERE id = 500000;
Run Code Online (Sandbox Code Playgroud)
对比
WITH cte AS (
SELECT * FROM foo
)
SELECT * FROM cte WHERE id = 500000;
Run Code Online (Sandbox Code Playgroud)
如果在第一个要求上懒惰地计算 CTE,那么我可以想象这两个查询可以以相同的方式进行优化(至少我认为)。
这让我想知道...... SQL Server 是否能够比 postgres 更好地优化这样的查询?
数据库之间在优化查询方面的程度/能力是否存在已知差异?
询问某件事是“更好”还是“更糟”的问题取决于个人意见,因此请谨慎对待。询问查询优化器的行为通常非常广泛,因为与您的问题中的极其简单的查询相比,在复杂情况下的行为不同。
对于 Postgres,CTE 是(从 Postgres 11 开始)所谓的“优化栅栏”。这意味着 Postgres 将独立于整体查询优化 CTE。在某些情况下,这会导致“更好”(=更快)计划,然后在某些情况下会导致“糟糕”(=更慢)计划(请注意,最近围绕此设计决策的讨论又开始了,所以也许这会在 Postgres 11 之后的未来版本中改变)。
您问题中的示例是这种方法导致“错误”计划的示例,因为外部查询的条件未推送到 CTE 中。
SQL Server 优化了包括 CTE 在内的整个查询,因此对于您的示例,SQL Server 中的执行计划将被视为“更好。
但是我在 Postgres 中也看到了相反的情况:当将(非平凡的)查询的一部分移动到 CTE 时,生成的计划更好,因为操作没有被推低,从而导致更好的估计和“更好”(=更快)执行计划。由于我几乎不使用SQL Server,我无法判断那里是否有类似的情况。
归档时间: |
|
查看次数: |
938 次 |
最近记录: |