exists, in, not in都属于不可优化的扫描参数,都会触发全表遍历。

解决方案 »

  1.   

    “exists, in, not in都属于不可优化的扫描参数,都会触发全表遍历。”可能有点错 :(摘:
    不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外还有函数。另外在sql server下面,exist与in的速度差不多,不知道oracle下如何。
      

  2.   

    select * from sometable 
    where id in ( 暴长的ID组合起来的字符串 )
    and  to_number(id)>0
      

  3.   

    To: licsth()
    select * from sometable 
    where id in ( 暴长的ID组合起来的字符串 )
    and  to_number(id)>0“to_number(id)>0”用来做什么的?
      

  4.   

    to:Dishine(Dishine Chen)
    >“to_number(id)>0”用来做什么的?
    用来启用index。
      

  5.   

    剛好我處理過類似的情況,當時我是這樣處理的:
    暴长的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太長,可以分三次分開執行
      

  6.   

    to:shyming(Forest Robber) 
    where id=id1 and id=id2....
    是错误的,应该是:
    where id=id1 or id=id2....
      

  7.   

    licsth() 說的對,應該是or才對,
    聽到ling242a()的建議,我覺得挺好的,結果我說的方法和他講的應該沒有問題:
    利用Excle的橫轉列的功能,將結果變成:
       |id1|
       |id2|
         ;
       |id2000|
    以後,建立temp table:xxtable(col)
    在pl/sql里:select xxtable for update,粘貼excel的內容,commit;
    (建立索引在xxtable上)再直接兩表關聯就很快,效率很高了。
      

  8.   

    感谢大家的帮助,最终达成的意思就是创建一个临时表,然后再查询。另外把若干个ID写成条件,用UltraEdit也可以很好的实现 :)