日期:2014-05-17  浏览次数:20583 次

关于SQL "not in" 效率的问题
各位专家,本人最近在研究数据库时发现在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秒时间,过几天又慢了,是不是因为缓冲的原因呀,有没有办法提高呀?


------解决方案--------------------
第二次就快了,你想的没有问题,是数据缓存和查询计划缓存的缘故。

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

试着给a,b表的id建上索引看看,然后用not exists。
------解决方案--------------------
try:
select a.id from a left join b on a.id=b.id
where b.id is null