RT语句形式如下:
SELECT * FROM TBName where (Field1=100001) OR (Field1=1000004) OR (Field1=1000003) OR (Field1=20001) OR (Field1=2341423) OR ....这个语句是我用程序根据用户指定文件生成的。时OR条件的数为12000多。执行这样的语句ORACLE竟然挂掉了,太恶心了。
而我OR条件的记录数为4500多条时却能顺利执行。有识之士请示出错原因,不胜感激。

解决方案 »

  1.   

    这样的SQL真是太恶心了,呵呵。
    看看性能优化的书,你就知道这样的SQL不挂掉才怪。
    不知道你的Field1对应的值是怎么得到的,如果也是从数据库里面取到的。
    那就应该改成in优化成exists。
    如果确实是由程序生成的,建议你把这些东西存到一个临时表里面,然后再进行查询。
    或者用array bind。
    OR用不上索引,而且这么多的or使得你的sql文本身就很长,你的share pool等等都有影响。
      

  2.   

    sql语句块最大支持32k,你的语句应该远远超过了
      

  3.   

    话说lz你花多长时间把这个语句写出来的啊
    有那时间按照楼上的说法n次结果都出了
      

  4.   

    lz为什么不用
    SELECT * FROM TBName where Field1 IN (100001, 1000004, 1000003, 20001, 2341423)就如2楼说的,sql语句块最大支持32k。
    你“4500多条”的sql总字数是多少?
      

  5.   

    我用的ORACLE10g.2楼所说的应该是不对的,“4500多条”的文件容量就已经超过40k了,能够顺利执行。
    用IN()效率超慢,而且IN()里的列表参数好像也只允许255()个。
      

  6.   

    作成临时表感觉实现不太方便。因为字段不是固定唯一的。
    用户给我指定的文件可能是这样的:
    Fields1 Fields3 Fieldx
    1         1        NULL
    2         0        2
    2         2        2
    3         NULL     NULL
    NULL      3        3也可能是:
    Fields1 Fields4
    1         1  
    2         0
    2         2
    3         NULL
    NULL      3
      

  7.   

    OR与IN,10g会自动优化的。
    在field1 column上加index。
    lz在7楼给的两个example,没看懂。与你的sql有什么对应关系?
      

  8.   

    这要按7楼提供给我的格式文件生成SQL查询语句
      

  9.   

    那就用
    (Field1 IN ()
    OR
    Field1 IN ()
    OR
    Field1 IN ()
    OR
    Field1 IN ())
    我感觉可能是设计方面(包括数据库结构)存在缺陷,导致lz现在面临where子句很长的情况。
    lz没有具体描述程序的背景,所以也题不出建议。