我有二个表,一张表的数据是300万不到,另外一张表只有5万多。
select a.userid
FROM (select *
FROM a_info where syear='2014' ) a LEFT JOIN yh_info b ON a.UserID=b.UserID
以上语句查询出35万条记录,用了4秒
下面就把年改了一下查询出1524条记录,却用了1分44秒,2015年总共记录只有1524条怎么会相差那么多时间呢?
我试了2013年、2012年都很快几秒就查询出来了。
select a.userid
FROM (select *
FROM a_info where syear='2015' ) a LEFT JOIN yh_info b ON a.UserID=b.UserID
------解决思路----------------------
执行计划对比一下,看是不是统计信息太旧了导致查询优化器选择了错误的执行计划
------解决思路----------------------
syear和userid都加索引了没
------解决思路----------------------
a_info 被其它会话更新中、有锁定,子查询有比较多的等待。
------解决思路----------------------
可能原因:
1、阻塞,即有其他会话在修改这个表的这部分数据,导致锁住数据。这种情况下,如果频繁发生,尝试加with nolock检测,如果加了就很快,那问题基本上是这个了。
2、数据分布不平均,到时索引上的统计信息不准确,对于非常大的表(没有标准),统计信息的更新阈值较高,500+(表总数的)20%才触发更新,这个可以手动更新一下表或者索引的统计信息(索引的更新直接重建索引即可),再进行查询,如果很快,那问题可能是这个。
常见的问题就这两个,还有一些比较啃爹的比如做了分区,而分区的数据刚好在别的文件组,这个文件组又在比较慢的盘上,或者索引碎片等问题,问题很多,最好对比一下快慢两次查询的执行计划
------解决思路----------------------
--建议改成:
SELECT t1.userid
FROM a_info t1 (NOLOCK)
LEFT JOIN yh_info t2 (NOLOCK) ON t1.UserID=t2.UserID
WHERE t1.syear=2015
------解决思路----------------------
楼主这样呢?
select a.userid FROM a_info a where syear='2015'
and exists(select 1 from yh_info b where a.UserID=b.UserID )