none
SQL Server2005查询语句时间范围不同,查询速度为何相差很大? RRS feed

  • 问题

  • select a,b,c from t1, t2, view1 where t1.id = t2.id and t2.id = view1.id
    and view1.date >='2010-01-01' and  view1.date <='2010-01-31'         --- 时间段较短,反而查询时间长
    查询速度很慢, 大约40秒。而
    select a,b,c from t1, t2, view1 where t1.id = t2.id and t2.id = view1.id
    and view1.date >='2009-01-01' and  view1.date <='2010-01-31'        ---- 时间段较大,查询时间却很短
    速度却很快,大约2秒,

    一般是什么原因?
    2010年2月5日 9:17

答案

  • 这种情况的可能原因是第二个查询可能不需要生成物理执行计划的时间了 ,建议开一个新的数据库连接,然后先执行select a,b,c from t1, t2, view1 where t1.id = t2.id and t2.id = view1.id
    and view1.date >='2009-01-01' and  view1.date <='2010-01-31' ,再执行select a,b,c from t1, t2, view1 where t1.id = t2.id and t2.id = view1.id and view1.date >='2010-01-01' and  view1.date <='2010-01-31'试试

    或者干脆就在两个不同的数据库连接中分别执行它们,再进行时间的比较
    2010年2月8日 6:16

全部回复

  • Hi,

    首先看看execution plan.比较有什么不同。
    2010年2月5日 11:57
  • And ensure statistics are up to date.
    2010年2月5日 18:11
  • 一、是否可能是
    “view1.date >='2009-01-01' and  view1.date <='2010-01-31'        ---- 时间段较大,查询时间却很短”这个范围的数据量较小?
    二、注意这个date的类型是日期型还是时间加日期型,有没有以此为依据建立分区?有没有建立索引?,可以参考下:
    http://blog.csdn.net/downmoon/archive/2010/02/04/5289635.aspx

    助人等于自助。3w@live.cn
    2010年2月7日 0:37
  • For 1, impossible. There are always more data in range between '2009-01-01' and '2010-01-31' than in range between '2010-01-01' and '2010-01-31'.

    2010年2月7日 2:59
  • 这种情况的可能原因是第二个查询可能不需要生成物理执行计划的时间了 ,建议开一个新的数据库连接,然后先执行select a,b,c from t1, t2, view1 where t1.id = t2.id and t2.id = view1.id
    and view1.date >='2009-01-01' and  view1.date <='2010-01-31' ,再执行select a,b,c from t1, t2, view1 where t1.id = t2.id and t2.id = view1.id and view1.date >='2010-01-01' and  view1.date <='2010-01-31'试试

    或者干脆就在两个不同的数据库连接中分别执行它们,再进行时间的比较
    2010年2月8日 6:16
  • 肯定是“在两个不同的数据库连接”中执行的两个查询。

    在查询分析器中查询,不论是先执行 “时间段较短”的查询,还是先执行“时间段较大”的查询,都是 时间段较大查询,查询时间短。

    2010年2月20日 6:33
  • 你把字符串 转换为 日期后作为条件查询一下 在做比较

    这个还是需要你提供查询计划,否则怎么帮你分析呢!


    family as water
    2010年2月21日 7:09
  • 还是把actual query plan贴出来吧,这样大家可以帮你分析分析。有可能SQL Server对第一个查询使用了view1.date上的索引->迭代:对每条符合时间段的记录,查找t1、t2表匹配记录。而对第二个查询,因为时间段较大,选择对t1、t2、view1做全表join,然后筛选符合时间段的数据。如果view1表数据量很大,而t1、t2数据量相对较小,有可能造成第一个查询反而更慢。
    2010年2月22日 3:03