檢查一條巢狀
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的字段外,還可...