-- 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万行。我可以对此做些什么吗?
答案 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;输出应该让你知道哪个表导致缓慢,并查看查询计划,看看是否有任何奇怪的操作符可能有助于更好地理解这种情况。