关于SQL "not in" 效率的问题

gfgen 2009-01-26 08:09:25
各位专家,本人最近在研究数据库时发现在SQL2000中NOT IN语句执行效率很低(用exists 也是一样的)。关键是第一次查询的时候慢,第二次就快了。如果几天不查询,再查询时就变的很慢。好像是查询一次后数据被缓冲了,长时间不查询后就放的硬盘中的原因,可是,如何提高第一次查询的速度呢?
表A (记录数120000条)
id(主键)

表B (记录数116000条)
id(主键)

查询语句:
select a.id from a where a.id not in (select b.id from b)
第一次查询时要用5秒左右时间,第二次只要不到1秒时间,过几天又慢了,是不是因为缓冲的原因呀,有没有办法提高呀?
...全文
1711 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
朝夕 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

try:
select a.id from a left join b on a.id=b.id
where b.id is null
[/Quote]
别乱说,测试了再说好不好,我刚测试了。你的方法根本就行不通。
gfgen 2009-02-06
  • 打赏
  • 举报
回复
select a.id form a where not exists (select 1 from b where a.id=b.id)
这种语句上的修改没有用的,我已经试过了,二楼说的很好.可以看看的.
但还是要想出解决问题的方法的.
数据量很大的表的设计是要考虑分区表的问题,计算机的计算能力是有限的.这对刚开发数据库的人是非常重要的启示,别犯和我同样的错误.等系统运行2\ 3年数据库太大,效率会下降.有些问题可以通过索引等方法解决,有些只有通过数据库结构的设计来完成.
gfgen 2009-02-06
  • 打赏
  • 举报
回复
要是没有办法,就只好将两者的差集保存在一个表中,这样就免得扫描了.呵呵,没办法的办法.谢谢各位专家了.用触发器在一个表中插入数据时就添加到差集的表中.这样添加数据的时候可能会有几毫秒的延时,但因为每次添加数据时都会执行not in 这样就速度就不会慢了.呵呵
ChinaJiaBing 2009-02-06
  • 打赏
  • 举报
回复
select a.id from a where a.id not in (select b.id from b)

select a.id form a where not exists (select 1 from b where a.id=b.id)
nzperfect 2009-02-06
  • 打赏
  • 举报
回复
没有办法.
gfgen 2009-02-06
  • 打赏
  • 举报
回复
呵呵,谁有办法呀,第一次查询速度这么慢,这么工作呀
kempinfo 2009-01-28
  • 打赏
  • 举报
回复
关注哦
gfgen 2009-01-27
  • 打赏
  • 举报
回复
由于第一次查询速度慢,要知道一个用户窗口是由好几个查询组成的,哈哈,第一次打开窗口要20秒时间,再查询一次就不到1秒了,可是,第一次有可能超时的呀,如果将查询时间设置的太长,呵呵,还以为是死机了。关键是第一次查询。谁会没完没了的查第二次呀。另外我也试了一下SQL的效率
select sum(jine) from a
a表有880000条记录,在企业管理器中运行,第一次竟然超时,再点击运行,呵呵,不到一秒就出结果了。
哥们们一个超市一年的销售记录也不止这个数,如果求一年的数据合计没这么长时间吧,更何况还要group by,有什么好办法提高第一次查询的速度吗?
用视图索引能解决group by 等问题,但无法解决not in ,呵呵,快晕了。
fcuandy 2009-01-26
  • 打赏
  • 举报
回复
是,如果没有在其它列上建聚集索引,那么id为主健的话,就会默认建立。 上面没注意到。
律己修心 2009-01-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 GDC_ZhaoYZ0304360 的回复:]
如果ID不是主键,那就建上吧,貌似没有别的好的解决办法!

该说的2楼已经说得很好很详细了
[/Quote]

打错了,晕!

ID是主键 那ID上面就应该有索引啊


律己修心 2009-01-26
  • 打赏
  • 举报
回复
如果ID不是主键,那就建上吧,貌似没有别的好的解决办法!

该说的2楼已经说得很好很详细了
Csunday 2009-01-26
  • 打赏
  • 举报
回复
try:
select a.id from a left join b on a.id=b.id
where b.id is null
fcuandy 2009-01-26
  • 打赏
  • 举报
回复
第二次就快了,你想的没有问题,是数据缓存和查询计划缓存的缘故。

两表数据量大致相当,按你的要求,not in,或 not exists在扫描a表的120000行中时,都会在116000行范围内扫,因为 select b.id from b 结果集确实很大。
这个匹配率应该比较高,not exists可能会比not in快一点点,不过也相差不很大。

试着给a,b表的id建上索引看看,然后用not exists。

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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