select id, taskcode,polcode,ricode,insuredcode,caltypecode,productcode,polyear,contcode,ritype,premtype,instcode,firsttermflag,caldate,inexflag,deleteflag,effectflag,rpttempcode,creator,res2 from cal_premium  where rpttempcode in ('TCRC2120060722011011', 'TCRC2120060722011015', 'TCRC2120060722011023', 'TCRC2120060722011027', 'TCRC2120060722011029', 'TCRC2120060722011035', 'TCRC2120060722011036', 'TCRC2120060722011039', 'TCRC2120060722011041', 'TCRC2120060722011043', 'TCRC2120060722011053', 'TCRC2120060722011056', 'TCRC2120060722011073', 'TCRC2120060722011075', 'TCRC2120060722011007', 'TCRC2120060722011031', 'TCRC2120060722011051', 'TCRC2120060722011025', 'TCRC2120060722011055', 'TCRC2120060722011019', 'TCRC2120060722011059', 'TCRC2120060722011065', 'TCRC2120060722011069', 'TCRC2120060722011005', 'TCRC2120060722011013', 'TCRC2120060722011017', 'TCRC2120060722011033', 'TCRC2120060722011071', 'TCRC2120060722011021', 'TCRC2120060722011049', 'TCRC2120060722011045', 'TCRC2120060722011047', 'TCRC2120060722011009', 'TCRC2120060722011067', 'TCRC2120060722011063')  and productcode in ('S51') and caltypecode in ('PC') and firsttermflag='FO' and deleteflag='F'  order by caltypecode,id asc
怎么优化一下 这语句?

解决方案 »

  1.   

    吧 in 换成 exist 试试看
      

  2.   

    避免在WHERE子句中使用in,not  in,or 或者having。可以使用 exist 和not exist代替 in和not in。可以使用表链接代替 exist。Having可以用where代替,如果无法代替可以分两步处理。例子SELECT *  FROM ORDERS WHERE CUSTOMER_NAME NOT IN 
    (SELECT CUSTOMER_NAME FROM CUSTOMER)优化
    SELECT *  FROM ORDERS WHERE CUSTOMER_NAME not exist 
    (SELECT CUSTOMER_NAME FROM CUSTOMER)
      

  3.   

    楼上的尽扯淡,如果in都可以用exists替代且exists效果好,那sql还要in这个关键字作甚
      

  4.   

    LZ的语句应该是程序生成的,别人完全不知道你的逻辑,来做语句本身优化可能性不大,可以从语句的执行计划增加一些必要的索引来解决问题另外类似于db2的bufferpool,oracle的sga的大小有没有调整
      

  5.   

    这两个有问题吧
    and productcode in ('S51') and caltypecode in ('PC') 
      

  6.   

    哦。明白了。ticmy说的对,你的这个SQL应该是程序拼的。想从关键字上进行优化的可能性不大了。
      

  7.   

    这个蛮简单的啊,只是你带到SQL中的值比较的多而已,看你能不能从代入值的地方优化下
      

  8.   


    如果能用exists替代in的情况下为什么不替代呢?
      

  9.   

    楼主你的结果集是哪里来的?应该是个组装的SQL吧!
      

  10.   

    (1)看你In条件里的数据也不多,不必要去转成exists..但想问一下你,可否将in的部分转换成“=”连接。。在oracle的执行计划里,in会被转换成"="的。。
    (2)不知道你索引是怎么建的?,如果执行效率不高的话,应该是索引建的有问题。把索引帖出来,我帮你看看。
      

  11.   

    谁说exists的效率一定比in好的?一般情况下IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况
    但是不同的数据库未必都表现出这样的情形我就碰到过一条in的语句,在oracle中执行需要1分多种,但在db2中仅需几秒
      

  12.   

    按Oracle的执行原理上来说:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况 这是正确的。。
    一些特殊情况的存在,也需要在相同数据,相同的表结构,相同数据库下测试才准确啊。。参考不一样,能证明什么?