如何加快这个sql server查询?

时间:2015-07-06 15:54:23

标签: sql-server performance join optimization

-- Holds last 30 valdates
create table #valdates(
    date int
)
insert into #valdates
   select distinct top (30) valuation_date 
   from tbsm.tbl_key_rates_summary 
   where valuation_date <= 20150529 
   order by valuation_date desc 

select 
    sum(fv_change), sc_group, valuation_date  
from
    (select * 
     from tbsm.tbl_security_scorecards_summary 
     where valuation_date in (select date from #valdates)) as fact
join 
    (select * 
     from tbsm.tbl_security_classification 
     where sc_book = 'UC' ) as dim on fact.classification_id = dim.classification_id
group by 
    valuation_date, sc_group

drop table #valdates

此查询大约需要40秒才能返回,因为事实表有近1300万行。我可以对此做些什么吗?

1 个答案:

答案 0 :(得分:0)

基于没有适当的索引来支持抓取的事实,这可能是真正提高性能的最简单(或唯一)选择。像这样的大多数指数会改善这种情况:

create index idx_security_scorecards_summary_1 on 
tbl_security_scorecards_summary (valuation_date, classification_id) 
include (fv_change)

当然,一切都取决于valu_date和classification_id字段的选择性有多好(=需要获取表的大部分),并且可能会以相反的顺序更好地工作。字段fv_change位于include部分,因此它包含在索引结构中,因此无需从基表中获取它。

如果SQL必须从表中获取大量行,则包括字段帮助。如果接触的行数很少,那么它可能根本没用。就像索引一样,这当然会减慢插入/更新速度,并且仅针对这种情况进行了优化,当然你也应该看一下大局。

选择是以一种有点奇怪的方式编写的,不确定这是否有所不同,但你也可以尝试正常的方法来做到这一点:

select 
    sum(fact.c), dim.sc_group, fact.valuation_date  
from
    tbsm.tbl_security_scorecards_summary fact
    join tbsm.tbl_security_classification dim
        on fact.classification_id = dim.classification_id
where 
    fact.valuation_date in (select date from #valdates) and
    dim.sc_book = 'UC'
group by 
    fact.valuation_date, 
    dim.sc_group

关注&#34;统计数据&#34;输出应该让你知道哪个表导致缓慢,并查看查询计划,看看是否有任何奇怪的操作符可能有助于更好地理解这种情况。