程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 用臨時表改善嵌套SQL語句的執行速度

用臨時表改善嵌套SQL語句的執行速度

編輯:關於SqlServer

用臨時表改善嵌套SQL語句的執行速度

左直拳

 

 

這兩天檢查一條嵌套SQL語句,發覺非常耗時。形如:

SELECT KeyId,COUNT(1) AS Num

FROM Table1

WHERE 1=1

AND CreateDate>='2007-09-21'

AND KeyId IN(SELECT KeyId FROM Table2 WHERE Id=1611)

GROUP BY KeyId

 

究其原因,大約該SQL語句執行的步驟是從Table1中每拿出一條記錄,都要執行

IN(SELECT KeyId FROM Table2 WHERE Id=1611) 一番

 

靠,數據庫也太弱智了吧。學編譯方法時就知道,編譯器會自動優化代碼,將一些計算從循環中提取出來,數據庫怎麼就不能先查找出

(SELECT KeyId FROM Table2 WHERE Id=1611)

的結果,然後再代入整條SQL語句中執行呢?

 

先是這樣修改:

SELECT a.KeyId,COUNT(1) AS Num

FROM Table1 a

, (SELECT KeyId FROM Table2 WHERE Id=1611) AS b

WHERE 1=1

AND a.CreateDate>='2007-09-21'

AND a.KeyId=b.KeyId

GROUP BY a.KeyId

 

結果發現沒什麼改進,有時甚至效果更壞。

 

把心一橫,祭出臨時表來:

SELECT KeyId INTO t# FROM Table2 WHERE Id=1611;

 

SELECT a.KeyId,COUNT(1) AS Num

FROM Table1 a

, t# AS b

WHERE 1=1

AND a.CreateDate>='2007-09-21'

AND a.KeyId=b.KeyId

GROUP BY a.KeyId;

 

DROP TABLE #t;

 

結果速度改善非常明顯。不必擔心並發操作時臨時表會有沖突,說這個會話創建了一個t#,那個會話也創建了一個t#。臨時表就好象局部變量,只在某個會話裡有意義。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved