关于查询语句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
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
来查询。
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28