2017-10-13 46 views
0

假設我有以下代碼:是IN(SELECT ...)對性能不好?

​​

請問子查詢的每一行一次又一次的執行?

如果是這樣,我可以執行它並存儲其結果並將它們用於每一行嗎?例如:

SELECT [otherColumn] 
INTO #Results 
FROM [myOtherTable] 

SELECT * 
FROM [myTable] 
WHERE [myColumn] IN (#Results) 
+0

優化器應緩存或創建臨時表,以便它不會重複執行子查詢。這是相對較好的。您還應該查看'EXISTS' –

+0

不,它不會影響性能,SQL Server可以選擇散列連接或合併連接(評估子查詢一次)或嵌套循環,這些循環將爲每個外部行執行子查詢的不同部分。 –

+0

直到您1)index 2)添加到where子句後,纔會獲得最佳性能。 –

回答

2

SQL服務器查詢優化器足夠智能,不會一遍又一遍地運行相同的子查詢。如果有的話,臨時表是不太理想的,因爲在得到結果後需要額外的步驟。

您可以通過查看SQL查詢執行計劃來看到這一點。

enter image description here

編輯:期待進一步調查此之後,它也可以是一次以上。顯然,查詢優化器也可以做很多有趣的事情,比如將你的IN轉換爲JOIN以提高性能。這裏有很多關於它的信息:Number of times a nested query is executed

無論如何,查看你的執行計劃,看看你的RDMS的查詢優化器決定做什麼。

1

您是否考慮過使用連接?我認爲這可能是最好的表現。

SELECT * FROM [myTable] INNER JOIN [myOtherTable] 
ON ([myTable][myColumn] = [myOtherTable][otherColumn]); 

但是,只有當您不希望重複出現在myOtherTable中時,這纔會起作用。