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多条时却能顺利执行。有识之士请示出错原因,不胜感激。
SELECT * FROM TBName where (Field1=100001) OR (Field1=1000004) OR (Field1=1000003) OR (Field1=20001) OR (Field1=2341423) OR ....这个语句是我用程序根据用户指定文件生成的。时OR条件的数为12000多。执行这样的语句ORACLE竟然挂掉了,太恶心了。
而我OR条件的记录数为4500多条时却能顺利执行。有识之士请示出错原因,不胜感激。
看看性能优化的书,你就知道这样的SQL不挂掉才怪。
不知道你的Field1对应的值是怎么得到的,如果也是从数据库里面取到的。
那就应该改成in优化成exists。
如果确实是由程序生成的,建议你把这些东西存到一个临时表里面,然后再进行查询。
或者用array bind。
OR用不上索引,而且这么多的or使得你的sql文本身就很长,你的share pool等等都有影响。
有那时间按照楼上的说法n次结果都出了
SELECT * FROM TBName where Field1 IN (100001, 1000004, 1000003, 20001, 2341423)就如2楼说的,sql语句块最大支持32k。
你“4500多条”的sql总字数是多少?
用IN()效率超慢,而且IN()里的列表参数好像也只允许255()个。
用户给我指定的文件可能是这样的:
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
在field1 column上加index。
lz在7楼给的两个example,没看懂。与你的sql有什么对应关系?
(Field1 IN ()
OR
Field1 IN ()
OR
Field1 IN ()
OR
Field1 IN ())
我感觉可能是设计方面(包括数据库结构)存在缺陷,导致lz现在面临where子句很长的情况。
lz没有具体描述程序的背景,所以也题不出建议。