Sql-Server

IN 子句的性能

  • February 27, 2014

索引數據會影響查詢性能嗎?意味著如果我在任何子句中以有序形式將值傳遞為 1,2,3,4… IN,它可以提高查詢性能嗎?如果我隨機傳遞值 2,5,7,9,1 等會發生什麼…

例子 :

Select Name from Emp 
where id IN (1,2,3,4)  -- Ordered values

要麼:

Select Name from Emp 
where id IN (4,2,7,98,34) -- Randomly ordered values

另一種方式 :

Select Name from Emp 
where id IN (Select empid from trans order by empty) -- Ordered values

我要求 MySql 以及 SQL-Server 數據庫。

誰能告訴我在上述情況下數據庫引擎如何獲得結果(執行計劃)?

對於您的前兩個查詢,在 SQL Server 上,查詢優化器將在進入數據庫之前為您排序值。您可以通過查看每個查詢的執行計劃的 seek 謂詞來確認這一點。兩個查詢的執行計劃是相同的:

在此處輸入圖像描述

對於第三個查詢,正如@gbn 所說,它將作為連接執行。在我的系統上,它作為內部連接執行。在這種情況下,性能歸結為索引和您正在處理的記錄數。

它們是2個不同的概念

  • where id IN ( 1,2,3,4)只是簡寫id = 1 OR id = 2 OR id = 3 OR ...
  • where id IN (Select empid from trans order by empty)半連接

因此,簡單數字列表的值排序完全沒有區別

對於半連接,無論如何都應該有一個索引,因為它是一種 JOIN。請注意,子查詢中的 ORDER BY 會在 SQL Server 上產生錯誤,因為它沒有意義(除非您使用 TOP)。不確定 MySQL,但我懷疑它會簡單地忽略它。

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