T-Sql
在連接語句的“On Clause”和“Where 子句”中過濾特定列之間的區別
我有兩個具有這些結構的表:
Table1(Date ,Code ,Name) Table2(Date ,Code)
我需要
date
為兩個表過濾一個特定的。例如,我只需要每個表中 ‘10/28/2019’ 的數據。我想知道這兩個查詢在最終結果和查詢性能方面是否存在差異。在First query
我正在過濾dates
中ON clause
和在second query
我正在過濾dates
中where clause
。這兩個查詢會產生不同的結果集嗎?提前致謝。查詢1:
Select "Desired Columns" From Table1 T1 Inner Join Table2 T2 On T1.Date = "The specific date" and T2.Date = "The specific date" and T1.Code = T2.Code
查詢2:
Select "Desired Columns" From Table1 T1 Inner Join Table2 T2 On T1.Code = T2.Code where T1.date ="The specific date" and T2.Date = "The specific date"
這兩個查詢會產生不同的結果集嗎?
從邏輯上講,兩個查詢必須產生相同的結果集,但是在查詢優化器和邏輯處理順序上的深化,兩個查詢可能會產生不同的工作負載(CPU 工作時間、邏輯讀取等),原因如下:
- 查詢 1:根據子句表
檢索過濾後的行,按子句呈現
ON``FROM``SELECT
- 查詢 2:
檢索行
FROM
表,根據子句過濾WHERE
並按子句呈現SELECT
以下查詢可以幫助查看兩個查詢的統計資訊。您還可以通過設置獲得 IO 見解
SET STATISTICS IO ON
SELECT t.[text] as sql_Text, s.total_elapsed_time, ((s.total_elapsed_time + 0.0) /s.execution_count) as avg_elapsed_time, s.total_worker_time, ((s.total_worker_time + 0.0) / s.execution_count) as avg_worker_time, s.total_clr_time FROM sys.dm_exec_query_stats AS s CROSS APPLY sys.dm_exec_sql_text(s.[sql_handle]) AS t WHERE t.[text] LIKE N'%From Table1 T1 Inner Join Table2 T2%' ORDER BY s.last_execution_time;