Sql-Server

ON 與 WHERE 的索引性能

  • October 9, 2017

我有兩張桌子

@T1 TABLE
(
   Id INT,
   Date DATETIME
)

@T2 TABLE
(
   Id INT,
   Date DATETIME
)

這些表在 (Id, Date) 上有一個非聚集索引

我加入這些桌子

SELECT *
FROM T1 AS t1
INNER JOIN T2 AS t2
ON 
   t1.Id = t2.Id
WHERE 
   t1.Date <= GETDATE()
   AND
   t2.Date <= GETDATE()

這也可以寫成

SELECT *
FROM T1 AS t1
INNER JOIN T2 AS t2
ON 
   t1.Id = t2.Id
   AND
   t1.Date <= GETDATE()
   AND
   t2.Date <= GETDATE()

我的問題是,這兩個查詢中哪一個提供了更好的性能,為什麼?或者他們是平等的?

性能將是相同的。優化器將辨識這一點並創建相同的計劃。

另一方面,我不會說他們是平等的。問題中的第一種形式更具可讀性並且通常是預期的。

例如,使用我手頭的一些表,您可以看到無論我如何編寫查詢,執行計劃都是完全相同的。

您應該能夠確定您自己的表和數據集的查詢計劃,這樣您就可以看到在您的情況下會發生什麼。

SELECT * FROM salestable , custtable 
WHERE salestable.custaccount = custtable.accountnum 
AND salestable.dataareaid = custtable.dataareaid

SELECT * FROM salestable 
JOIN  custtable 
ON salestable.custaccount = custtable.accountnum 
AND salestable.dataareaid = custtable.dataareaid

SELECT * FROM salestable JOIN custtable 
ON salestable.custaccount = custtable.accountnum 
WHERE salestable.dataareaid = custtable.dataareaid

給出這些執行計劃

在此處輸入圖像描述

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