SQL查询not in,或是同一字段多个!=效率超低,怎样优化??

qingmumu1985 2010-05-19 04:30:35
在一个只有1330条记录的表A中有个字段comname,对comname不等于“广州”,“深圳”,“珠海”,“中山”等条件进行筛选数据,使用!=、and进行筛选查询时效率如下:

select * from A where comname !='广州';结果:1191条,用时:0.563秒。

select * from A where comname !='广州' and A.comname !='深圳';结果:1080条,用时:0.516秒。

select * from A where comname !='广州' and A.comname !='深圳' and A.comname !='珠海';结果:1006条,用:13.065秒。 -_-!!!

select * from A where comname !='广州' and A.comname !='深圳' and A.comname !='珠海' and A.comname !='中山';结果:974条,用时:25.128秒。 -_-!!!

使用not in 进行筛选时和上面大致相同:

select * from A where comname not in ('广州');结果:1191条,用时:0.596秒。

select * from A where comname not in ('广州','深圳');结果:1080条,用时:0.547秒。

select * from A where comname not in ('广州','深圳','珠海');结果:1006条,用时:13.844秒。 -_-!!!

select * from A where comname not in ('广州','深圳','珠海','中山');结果:974条,用时:26.145秒。 -_-!!!


同一字段不等于筛选超过2个时,效率明显超低,而且个数越多用时越多。上面的结果都是多次测试,大致用时如上。
请教老鸟们是否遇到同样问题,为什么会这样,怎样去优化?
PS:数据库为oracle 10g。使用工具pl/sql。





...全文
1907 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingmumu1985 2010-05-19
  • 打赏
  • 举报
回复
呵呵,找到原因了,谢谢各位支持!
结贴,给分。
etsilence 2010-05-19
  • 打赏
  • 举报
回复
我自己测试这几个查询几乎没什么差别,在1300多条记录的基础上。

如果LZ确定查询的是一张表而不是视图,而且这张表中没有大字段没有N多列的话,请LZ去百度搜索人品测试软件,需要的话我可以给个链接,^_^。
minoboy 2010-05-19
  • 打赏
  • 举报
回复
觉得有点不可思议.....
应该都差不多的.
codearts 2010-05-19
  • 打赏
  • 举报
回复
pl sql developer里面,选中一个SQL语句,按F5, 然后把执行计划帖出来了。

qingmumu1985 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 codearts 的回复:]

引用 13 楼 etsilence 的回复:

注意到LZ的记录数只有1330条,速度怎么会这么慢呢?是不是有lob字段?


我也觉得,楼主能否帖出执行计划,以供我们分析原因?
[/Quote]

在java后台遇到的这个问题,上面写的就是我直接在PL/SQL上进行的测试,与后台语言执行无关。
qingmumu1985 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 shao5155285 的回复:]

原则
1.不使用like %**%
2.在where所有常用用到的列上创建索引或组合索引
[/Quote]

为什么“原则“不使用 like ?
我最后也是用like应付过去的,还好要筛选的四个有一个相同的字符。
现在把它贴出来是想请教下高手,到底是什么原因。
qingmumu1985 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 etsilence 的回复:]

注意到LZ的记录数只有1330条,速度怎么会这么慢呢?是不是有lob字段?
[/Quote]

没有lob字段?
如果有会怎样?
codearts 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 etsilence 的回复:]

注意到LZ的记录数只有1330条,速度怎么会这么慢呢?是不是有lob字段?
[/Quote]

我也觉得,楼主能否帖出执行计划,以供我们分析原因?
qingmumu1985 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 tangren 的回复:]

1、!=、<>、not like 等是不能用上索引的。
2、实际测试了,增加条件性能差别不大,没有遇到你这种情况。
[/Quote]

我在两个服务器上测试了N遍,都是那个结果。杯具!
qingmumu1985 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 iihero 的回复:]

当你的not in(....)中的元素的个数很多时,不妨采用临时表。然后两表关联查询。
该列也得建索引。
[/Quote]

杯具的是我恰好要筛选4个。
etsilence 2010-05-19
  • 打赏
  • 举报
回复
注意到LZ的记录数只有1330条,速度怎么会这么慢呢?是不是有lob字段?
tangren 2010-05-19
  • 打赏
  • 举报
回复
1、!=、<>、not like 等是不能用上索引的。
2、实际测试了,增加条件性能差别不大,没有遇到你这种情况。
weiki516 2010-05-19
  • 打赏
  • 举报
回复
原则
1.不使用like %**%
2.在where所有常用用到的列上创建索引或组合索引
iihero_ 2010-05-19
  • 打赏
  • 举报
回复
当你的not in(....)中的元素的个数很多时,不妨采用临时表。然后两表关联查询。
该列也得建索引。
qingmumu1985 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 youngmumu 的回复:]

是用 "<> "应该快些吧 如果in 的条件是通过其他表查询出来的建议用 连接查询
[/Quote]

使用 "<>"的效果是一样的,只是简单的筛选,不是通过其它表查询出来的。
冷木 2010-05-19
  • 打赏
  • 举报
回复
是用 "<> "应该快些吧 如果in 的条件是通过其他表查询出来的建议用 连接查询
qingmumu1985 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ojuju10 的回复:]

comname 上面建立位图索引
[/Quote]

具体的语句?
ojuju10 2010-05-19
  • 打赏
  • 举报
回复
comname 上面建立位图索引
qingmumu1985 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 njl_ily_2009 的回复:]

支持 学习
[/Quote]

打酱油的-_-!
NJL_ILY_2009 2010-05-19
  • 打赏
  • 举报
回复
支持 学习
加载更多回复(3)

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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