Sql-Server

查詢優化的“質量”是否因數據庫提供商而異?

  • September 18, 2018

除了“它發生”之外,我對任何數據庫中的查詢優化都沒有清楚的了解。現在我剛剛看到一篇“中等”文章,它討論了在優化方面使用 PostgreSQL CTE 的缺陷,因為 CTE 只評估一次,並且任何可以根據 CTE 的使用方式應用的優化,數據庫就是不能申請。

但是部落格文章中的範例似乎很容易優化 - 即

SELECT * FROM foo WHERE id = 500000;

對比

WITH cte AS (
 SELECT * FROM foo
)
SELECT * FROM cte WHERE id = 500000;

如果 CTE 的計算是在第一個要求時懶惰地完成的,那麼我會想像這兩個查詢可以以相同的方式進行優化(至少我認為)。

這讓我想知道…… SQL Server 是否能夠比 postgres 更好地優化這樣的查詢?

數據庫之間在優化查詢方面是否存在已知差異?

詢問某件事是“更好”還是“更差”的問題取決於個人意見,因此請謹慎對待。詢問查詢優化器的行為通常非常廣泛,因為與您問題中的極其簡單的查詢相比,複雜情況下的行為不同。

對於 Postgres,CTE 是(從 Postgres 11 開始)所謂的“優化圍欄”。這意味著 Postgres 將獨立於整體查詢優化 CTE。在某些情況下,這會導致“更好”(=更快)計劃,然後在某些情況下會導致“糟糕”(=更慢)計劃(請注意,最近圍繞此設計決策的討論再次開始,所以也許這會在 Postgres 11 之後的未來版本中改變)。

您問題中的範例是一個範例,其中此方法導致“錯誤”計劃,因為外部查詢的條件未推送到 CTE 中。

SQL Server 優化了包括 CTE 在內的整個查詢,因此對於您的範例,SQL Server 中的執行計劃將符合“更好”的條件。

但是我在 Postgres 中也看到了相反的情況:當將(非平凡的)查詢的一部分移動到 CTE 中時,生成的計劃會更好,因為沒有下推的操作會導致更好的估計和“更好”(=更快)執行計劃。由於我幾乎不使用 SQL Server,所以我不知道那裡是否有類似的情況。

引用自:https://dba.stackexchange.com/questions/217788