“exists, in, not in都属于不可优化的扫描参数,都会触发全表遍历。”可能有点错 :(摘: 不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外还有函数。另外在sql server下面,exist与in的速度差不多,不知道oracle下如何。
select * from sometable where id in ( 暴长的ID组合起来的字符串 ) and to_number(id)>0
To: licsth() select * from sometable where id in ( 暴长的ID组合起来的字符串 ) and to_number(id)>0“to_number(id)>0”用来做什么的?
不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外还有函数。另外在sql server下面,exist与in的速度差不多,不知道oracle下如何。
where id in ( 暴长的ID组合起来的字符串 )
and to_number(id)>0
select * from sometable
where id in ( 暴长的ID组合起来的字符串 )
and to_number(id)>0“to_number(id)>0”用来做什么的?
>“to_number(id)>0”用来做什么的?
用来启用index。
暴长的ID组合=id1,id2,id3,id4,...id2000..
1.將其Copy到Excel,另存為CSV,以逗號做分隔符,這樣結果是id1|id2|...被列隔開
2.利用Excle的橫轉列的功能,將結果變成:
|id1|
|id2|
;
|id2000|
3. 將excle內容Copy到文本文檔kk.txt中
4. 打開kk.txt:Ctrl+F 將所有的'id'替代為:'and id=id'
(這個步驟可以靈活運用id前綴,或從Excel copy的時候在前面新增一列,此列內容全部為‘XXX’,再做全文替換:"XXX"--> "and id=")
5. 格式會變成:
and id=id1
and id=id2
;
and id=id2000
6.補會此SQL
where id=id1 and id=id2....
如果覺得些SQL太長,可以分三次分開執行
where id=id1 and id=id2....
是错误的,应该是:
where id=id1 or id=id2....
聽到ling242a()的建議,我覺得挺好的,結果我說的方法和他講的應該沒有問題:
利用Excle的橫轉列的功能,將結果變成:
|id1|
|id2|
;
|id2000|
以後,建立temp table:xxtable(col)
在pl/sql里:select xxtable for update,粘貼excel的內容,commit;
(建立索引在xxtable上)再直接兩表關聯就很快,效率很高了。