当前位置: 代码迷 >> Sql Server >> 用LEFT JOIN查询现年之前的数据很很快,查询今年是数据却很慢
  详细解决方案

用LEFT JOIN查询现年之前的数据很很快,查询今年是数据却很慢

热度:93   发布时间:2016-04-24 09:13:24.0
用LEFT JOIN查询今年之前的数据很很快,查询今年是数据却很慢?
我有二个表,一张表的数据是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 )
  相关解决方案