+ -
当前位置:首页 → 问答吧 → 关于查询语句in的优化,提高效率

关于查询语句in的优化,提高效率

时间:2011-09-02

来源:互联网

比如有一张用户表userinfo(id ,name ,sex ,....)表中大概有10万条左右的纪录,现在用户给了一张excle表中大概列出了2万左右的用户的“name”的清单(这里名字假设为A1,A2,A3 .... ,A20000),现在要根据这个清单找出这2万左右用户的信息,于是我先读取了excle组合成了下面的sql语句:
 select * from userinfo where name in ('A1','A2',....,'A999') or name in('A1000','A1001',....,'A1999') or name in ('A2000','A2001',....,'A2999') ...... or name in ('A19000','A19001',....,'A19999') or name in ('A20000');
由于用的是oracle 10g查询语句中如果in()中不是子查询语句的话,是具体的值则不能超过1000个,所以我分成了21组in组成了上面的SQL语句,但是这种查询效率很低,并且当组和的个数大概超过16个以上也就是in的参数有16000个以上时,将上面的sql语句用plsql执行时会报错:“ORA-03113: 通信通道的文件结束”。这个错误我找了好多资料也没有解决,所以我打算从sql方面进行优化,不知道大家有没有遇到过这种问题。请大家帮忙看下能帮我把sql给优化一下,或者能告诉我怎么解决“ORA-03113: 通信通道的文件结束”这个问题也行,谢谢!
操作系统 : windows Server 2003 , 数据库版本 :Oralce Database 10g Enterprise 10.2.0.1.0

作者: luzhiyonghello   发布时间: 2011-09-02

将Excel中的数据直接读取并插入到数据库中的某个表或者临时表中,然后通过SQL语句

SQL code

SELECT * FROM USERINFO A WHERE EXITS(SELECT 1 FROM TEMPTB B WHERE A.NAME = B.NAME)



来查询。

作者: hao1hao2hao3   发布时间: 2011-09-02

你可以把 excle 的name插入到一张临时表里,然后两张表做关联查询,这样快很多

作者: opps_zhou   发布时间: 2011-09-02