T-Sql

在連接語句的“On Clause”和“Where 子句”中過濾特定列之間的區別

  • October 29, 2019

我有兩個具有這些結構的表:

Table1(Date ,Code ,Name)
Table2(Date ,Code)

我需要date為兩個表過濾一個特定的。例如,我只需要每個表中 ‘10/28/2019’ 的數據。我想知道這兩個查詢在最終結果和查詢性能方面是否存在差異。在First query我正在過濾datesON clause和在second query我正在過濾dateswhere 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;

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