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

luzhiyonghello 2011-09-02 11:02:43
比如有一张用户表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
...全文
214 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯狂的驴子 2011-09-02
  • 打赏
  • 举报
回复
可以直接 用两张表关联吗?能直接关联查询最好了。最近,我也为这个在项目中头痛了。
咖啡 2011-09-02
  • 打赏
  • 举报
回复
尽量少用IN

用临时表吧,然后两表关联就好了。

exits
opps_zhou 2011-09-02
  • 打赏
  • 举报
回复
你可以把 excle 的name插入到一张临时表里,然后两张表做关联查询,这样快很多
hao1hao2hao3 2011-09-02
  • 打赏
  • 举报
回复
将Excel中的数据直接读取并插入到数据库中的某个表或者临时表中,然后通过SQL语句


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


来查询。

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧