Select DAGUID,DAH,XMMC,AJMC,GDSJ,GDBZ
from ZL_ARCHIVES
where (DAH like '%''%' or XMMC like '%''%' or AJMC like '%''%' )
and GDBZ='3'
and DELSIGN is null
and DAGUID In(XXX,XXX)--1000条记录
Or DAGUID In(XXX,XXX)--1000条记录
Or DAGUID In(XXX,XXX)--1000条记录
Or DAGUID In(XXX,XXX)--1000条记录
Or DAGUID In(XXX,XXX)--1000条记录
Or DAGUID In(XXX,XXX)--1000条记录
Or DAGUID In(XXX,XXX)--1000条记录
Or DAGUID In(XXX,XXX)--1000条记录
Or DAGUID In(XXX,XXX)--1000条记录
最后的查询条件里面,Or DAGUID In(结果集),这个结果集有9000条左右的数据,因为Oracle的In的结果集不能超过1000条,就按照网上的办法改成这样了,但是速度超级慢,查出来要150秒左右,请问怎么调整SQL语句才能让速度快一些呢?
------解决方案--------------------
Select DAGUID,DAH,XMMC,AJMC,GDSJ,GDBZ
from ZL_ARCHIVES t
where (DAH like '%''%' or XMMC like '%''%' or AJMC like '%''%' )
and GDBZ='3'
and DELSIGN is null
and exists (
select 1 from table_name s where s.column1 = t.DAGUID
)
------解决方案--------------------
你可以先把9000 条DAGUID 合成用逗号隔开的字符串,然后以CLOB的方式传递到DB,在DB用函数把CLOB转成内存表,变成类似如下的函数:
Select DAGUID,DAH,XMMC,AJMC,GDSJ,GDBZ
from ZL_ARCHIVES t
where (DAH like '%''%' or XMMC like '%''%' or AJMC like '%''%' )
and GDBZ='3'
and DAGUID in (
select * from table(split (:CLOB))
)
其中split函数可以参考https://community.oracle.com/message/4558212,不过那个帖子的输入参数是varchar2.
如果你的数据库版本是oracle 11g的话,可以用xmltable函数替代 table(split())