用臨時表改善巢狀sql語句的執行速度
左直拳這兩天檢查一條巢狀sql語句,發覺非常耗時。形如:
select
keyid,
count
(1)as num
from
table1
where
1=1and
createdate>=
'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=1and
a.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=1and
a.createdate>=
'2007-09-21'
anda.keyid=b.keyid
group
by a.keyid;
drop table #t;
結果速度改善非常明顯。不必擔心併發操作時臨時表會有衝突,說這個會話建立了乙個t#,那個會話也建立了乙個t#。臨時表就好象區域性變數,只在某個會話裡有意義。
用臨時表改善巢狀SQL語句的執行速度
檢查一條巢狀 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 g...
用臨時表改善巢狀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的字段外,還可...