Sql-Server
IN 子句的性能
索引數據會影響查詢性能嗎?意味著如果我在任何子句中以有序形式將值傳遞為 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,但我懷疑它會簡單地忽略它。