请教数据库多条件查询效率优化问题

dmeng7777 2011-03-25 01:24:54
  以前学的编程,好久不用现在忘的都差不多了。最近帮朋友写个小程序,对于多条件查询有些问题,听听大家的指点。谢谢!

  环境:jdk1.7、sqlserver2000、tomcat6.0

  查询条件:邮政编码、员工人数、机器设备数量、项目编号(不是主键id)、营业范围、公司名称。

  我现在有两种方案,一是AND所有条件,然后在这个结果集中模糊查询“公司名称”,还有一个就是查询最严格的条件,然后分别把结果集作为查询范围,再在这个结果集的范围里查询次严格的条件,以此类推,最后再模糊查询“公司名称”。(就是:SELECT * FROM 表 WHERE name LIKE '%条件%' AND EXISTS (SELECT * FROM 表 WHERE 字段=条件 AND EXISTS(......)))

  目前数据量在3万左右,以后还会增长。想请问大家,这种种查询语句,哪一种效率上更高一点?
...全文
143 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingyuan18 2011-03-25
  • 打赏
  • 举报
回复
第二种子查询方式效率并不见得高,因为子查询的表join方式通常都是NSLOOP,每一条外表记录循环整个内表,且sql维护起来麻烦,没有必要

像DB2那样的数据库即使你写成子查询,底层优化器也会给你重写成最优的多表连接方式,所以sql的执行效率有时并不是代码select方式改变就能改变得了的

关注索引,bufferpool,排序堆.....这些是数据库层影响sql效率的关键因素
dmeng7777 2011-03-25
  • 打赏
  • 举报
回复
基本上查询条件里都是String类型的,没有int字段,这个数据量最多应该也就是十几万,撑死了过不去二三十万了。
dmeng7777 2011-03-25
  • 打赏
  • 举报
回复
目前数据量在3万左右,以后还会增长。想请问大家,这两种查询语句,哪种效率更高一点?

  我不太懂数据库的查询原理,但是个人感觉如果是AND的话,应该是找出一条记录来比对条件字段,就算是整表查的话,它最多也是查一次,但是会比较很多字段。

  可是如果是子查询的话,遇到需要整表查的字段,也许至少要整表查询一次甚至更多。虽然每次可能只是比对一个字段,但是可能会整表检索很多次。

  个人感觉是拼接条件比子查询效率要高一点,但是不确定,所以发贴听听大家的建议,感谢大家响应。
marf_cn 2011-03-25
  • 打赏
  • 举报
回复
千万别用子查询
marf_cn 2011-03-25
  • 打赏
  • 举报
回复
把string类型的也加索引效率反而不高。
这样的方法应该是最佳的:
1.所有int或数值字段加索引;
2.sql中先查询出符合输入条件是数值字段的值;
3.在内存中做操作找出符合字符字段的。

你现在这个数据量很小,预估一下最大量是多少,几十万量级直接全部where也无妨
dmeng7777 2011-03-25
  • 打赏
  • 举报
回复
我不太懂数据库的查询原理,但是个人感觉如果是AND的话,应该是找出一条记录来比对条件字段,就算是整表查的话,它最多也是查一次,但是会比较很多字段。

可是如果是子查询的话,遇到需要整表查的字段,也许至少要整表查询一次甚至更多。虽然每次可能只是比对一个字段,但是可能会整表检索很多次。

个人感觉是拼接条件比子查询效率要高一点,但是不确定,所以发贴听听大家的建议,感谢大家响应!
wall路小飞 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kai27ks 的回复:]
第一种。 不信你可以执行语句,多比较几次。
第二种,用了多个子查询,不需要,语句拼接起来也吃力,执行速度也慢。
虽然第一种是在所有范围内不断排除的,但是SQL会自动优化,每一次AND都是在上一个AND排除后的基础后再查询的,效率上比你自己那样写子查询要高很多。
[/Quote]额。。。。SQL会自动优化我忘了、、、、
luman2002 2011-03-25
  • 打赏
  • 举报
回复
有子查询效率会慢很多
kai27ks 2011-03-25
  • 打赏
  • 举报
回复
第一种。 不信你可以执行语句,多比较几次。
第二种,用了多个子查询,不需要,语句拼接起来也吃力,执行速度也慢。
虽然第一种是在所有范围内不断排除的,但是SQL会自动优化,每一次AND都是在上一个AND排除后的基础后再查询的,效率上比你自己那样写子查询要高很多。
wall路小飞 2011-03-25
  • 打赏
  • 举报
回复
还是后者吧!前者一个and就会查询一次,不如后者有一个规定范围还好些~!!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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