想請教一下大大
在SQL中
select name from A where id in (1,5,7,1234.......)
由於in中的數量是動態的,可能多達上百個,且不連續
不知道有沒有其他更好的寫法可以改善效能
謝謝
若你真的非使用不可,可作兩次的作法,或許可快一些..
提資料庫端的查詢指令改成 Select * From a Where a.ID >= ba And a.ID <= bb
這樣資料庫可利用你所建置的索引,快速的取出你的資料...
然後,在前端利用程式的迴圈,再過濾一次你要的資料,如此,平均分擔資料的運算,即不占用你伺服器的資源,又可妥善使用你前端的效能,這可能會是一個較妥善的辦法...
把 A table 的 id 這個欄位建立索引 (unique index),就會有可觀的效能改善了。
PS. 如果 id 就是 primary key,就等同 unique index 效果了。
select name from A where id in (1,5,7,1234.......)
欄位少少.....就用covering index
CREATE INDEX IX_A_ID ON A(ID,NAME);
SQL SERVER 則可考慮建非叢集索引:
CREATE NONCLUSTERED INDEX IX_A_ID ON A(ID,NAME);
想請教一下大大
在SQL中
檢視原始檔複製到剪貼簿列印關於
select name from A where id in (1,5,7,1234.......)由於in中的數量是動態的,可能多達上百個,且不連續
不知道有沒有其他更好的寫法可以改善效能
謝謝
這種問題很正常
不需要蒙面
Oracle 印度團隊都會亂寫
你不了也是正常囉!!!!
改成 EXISTS (SELECT * FROM xx_list_table WHERE xx.ID=oo.ID)
這樣比 IN 速度快 100倍
in (1,5,7,1234.......)
在調校SQL中, 還要考量到條件是已知的資料, 還是表格.......
而且最重要的事....索引一定要建好....
條件若是已知資料, 通常是放在IN (.....);
條件若是表格中的大量資料, 確實將 IN 改成 EXISTS,
採用直接代入驗證, 確實比挑出大量資料後再一一比對快許多.....
至於暫存檔應是不用如此大費周章......
總之, 這個題目根本原因就是....沒建 ID 開頭的索引......
charmmih提到:
採用直接代入驗證, 確實比挑出大量資料後再一一比對快許多.....
EXISTS: 直接代入驗證, true/false
IN: 挑出大量資料後, 再一一比對true/false