假設我有以下代碼:是IN(SELECT ...)對性能不好?
請問子查詢的每一行一次又一次的執行?
如果是這樣,我可以執行它並存儲其結果並將它們用於每一行嗎?例如:
SELECT [otherColumn]
INTO #Results
FROM [myOtherTable]
SELECT *
FROM [myTable]
WHERE [myColumn] IN (#Results)
假設我有以下代碼:是IN(SELECT ...)對性能不好?
請問子查詢的每一行一次又一次的執行?
如果是這樣,我可以執行它並存儲其結果並將它們用於每一行嗎?例如:
SELECT [otherColumn]
INTO #Results
FROM [myOtherTable]
SELECT *
FROM [myTable]
WHERE [myColumn] IN (#Results)
SQL服務器查詢優化器足夠智能,不會一遍又一遍地運行相同的子查詢。如果有的話,臨時表是不太理想的,因爲在得到結果後需要額外的步驟。
您可以通過查看SQL查詢執行計劃來看到這一點。
編輯:期待進一步調查此之後,它也可以是一次以上。顯然,查詢優化器也可以做很多有趣的事情,比如將你的IN
轉換爲JOIN
以提高性能。這裏有很多關於它的信息:Number of times a nested query is executed
無論如何,查看你的執行計劃,看看你的RDMS的查詢優化器決定做什麼。
您是否考慮過使用連接?我認爲這可能是最好的表現。
SELECT * FROM [myTable] INNER JOIN [myOtherTable]
ON ([myTable][myColumn] = [myOtherTable][otherColumn]);
但是,只有當您不希望重複出現在myOtherTable中時,這纔會起作用。
優化器應緩存或創建臨時表,以便它不會重複執行子查詢。這是相對較好的。您還應該查看'EXISTS' –
不,它不會影響性能,SQL Server可以選擇散列連接或合併連接(評估子查詢一次)或嵌套循環,這些循環將爲每個外部行執行子查詢的不同部分。 –
直到您1)index 2)添加到where子句後,纔會獲得最佳性能。 –