none
BK表查询语句的优化问题 RRS feed

  • 问题

  • [table]和[table_bk]中都有一个时间列,有索引
    因为查询主要集中在最近一个月的数据上,为提高查询速度.
    用作业定期将[表table]一个月以前的数据移动到BK表中[表table_bk]
    这样[table]总是只有最近一个月的数据,而[table_bk]可能有1年或者更多的数据,
    [table_bk]的数据量非常大,上千万行.

    现在有一个基于时间范围的查询,大多时候只查一个月内的数据,但是偶尔也会查一个月以前的数据.

    假设@datefrom和@dateto是查询范围的起止时间,如果这样查询
    select .... from [table] as t1 where actdttm >= @datefrom and actdttm < @dateto
    照会2个小时数据大约需要2-3分钟,勉强可以接受.

    但是因为@datefrom和@dateto有可能是一个月以前的数据,所以只好union all上BK表
    select .... from
      (select * from [table]
        union all
       select * from [table_bk]) t1
    where actdttm >= @datefrom and actdttm < @dateto

    假设这两次查询 @datefrom和@dateto 相同并且都是一个月内的,
    从估计的执行计划上看,后者竟然比前者慢10倍.

    请问,这种情况如何优化才好啊?

    2009年10月13日 5:41

答案

全部回复