用臨時表改善巢狀SQL語句的執行速度

2021-04-26 20:30:08 字數 1333 閱讀 6248

檢查一條巢狀

sql語句,發覺非常耗時。形如:

select

keyid,

count

(1)as num

from

table1

where

1=1

andcreatedate>=

'2007-09-21'

andkeyid 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

anda.createdate>=

'2007-09-21'

anda.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

anda.createdate>=

'2007-09-21'

anda.keyid=b.keyid

group

by a.keyid;

drop table #t;

結果速度改善非常明顯。不必擔心併發操作時臨時表會有衝突,說這個會話建立了乙個#

t,那個會話也建立了乙個

t#。臨時表就好象區域性變數,只在某個會話裡有意義。

用臨時表改善巢狀SQL語句的執行速度

用臨時表改善巢狀sql語句的執行速度 左直拳這兩天檢查一條巢狀sql語句,發覺非常耗時。形如 select keyid,count 1 as num from table1 where 1 1and createdate 2007 09 21 andkeyid in select keyid fro...

用臨時表改善巢狀SQL語句的執行速度

用臨時表改善巢狀sql語句的執行速度 左直拳這兩天檢查一條巢狀sql語句,發覺非常耗時。形如 select keyid,count 1 as num from table1 where 1 1and createdate 2007 09 21 andkeyid in select keyid fro...

SQL語句建立臨時表

1.insert into select語句 語句形式為 insert into table2 field1,field2,select value1,value2,from table1 要求目標表table2必須存在,由於目標表table2已經存在,所以我們除了插入源表table1的字段外,還可...