數據庫select in語句怎么優化
1. *_number 和 *one 都應該有索引,不然怎么弄都慢的
2. 換用存在語法代替in語法,樓上有說的
3. 不覺得連接語法會比存在語法快很多,lz可以試一下。
4. 試試以下變通會不會快一點
SELECT SUM(CNT) FROM (select (select count(*) as cnt from receivefax t where *_number = *one) AS CNT from tmp_duanxin_ljx_20100402 td );
我試了一下這樣比存在語法要快一倍,連接語法和存在語法的速度差別不大
你是說TD表中可能有重復的嗎?如果這樣的話,我這個查詢應該是沒有壓縮重復的,連接查詢也沒有壓縮,存在和in查詢都是忽略了TD中的重復的。至于t中的重復,都是*肯定沒有壓縮的
查詢優化是很復雜的,和具體的表的設計情況、表中數據的重復情況等等也有很大關系的,你自己用多種方法試一試吧,如果是oracle 在PL/SQL中執行完了,按F5進去可以看具體的執行情況,其它的一般也帶查詢分析器之類的,只有這樣才能真正看出你的SQL語句的執行效率的
sql 語句 in的優化
假設原來的句子是
select * from t1 where t1.f1 in (select t2.f2 from t2 where t2.f2=xxx)
和你的很類似
你用子查詢 很慢
我們現在修改為:
select t1.* from t1 ,t2 where t1.f1 = t2.f2 and t2.f2=xxxx
這里使用了關聯查詢代替了子查詢大大提高效率。
其次你可以考慮在表t1.f1上加索引,提高查詢速度。