我是初学者,所以希望你能提供帮助。我正在使用SQL Server 2008R2,并且有一个视图由四个表组成,这些表全部连接在一起:
SELECT DISTINCT ad.award_id,
bl.funding_id,
bl.budget_line,
dd4.monthnumberofyear AS month,
dd4.yearcalendar AS year,
CASE
WHEN frb.full_value IS NULL THEN '0'
ELSE frb.full_value
END AS Expenditure_value,
bl.budget_id,
frb.accode,
'Actual' AS Type
FROM dw.dbo.dimdate5 AS dd4
LEFT OUTER JOIN dbo.award_data AS ad
ON dd4.fulldate BETWEEN ad.usethisstartdate AND
ad.usethisenddate
LEFT OUTER JOIN dbo.budget_line AS bl
ON bl.award_id = ad.award_id
LEFT OUTER JOIN dw.dbo.fctresearchbalances AS frb
ON frb.el3 = bl.award_id
AND frb.element4groupidnew = bl.budget_line
AND dd4.yearfiscal = frb.yr
AND dd4.monthnumberfiscal = frb.period
该视图有9列和150万行并且还在增长。对于所有行,从该视图中选择*需要20分钟。我在连接的表中的字段上添加了索引,并将其改进为10分钟。我的问题是我还能做些什么来让选择更快地运行?
非常感谢,Violet。
答案 0 :(得分:0)
尝试删除案例陈述。
如果您有150万行,如果您对这些行的聚合感兴趣而不是整个集合,那么您可能需要先对fctResearchBalances中的行求和,然后再进行连接。
(如果没有看到访问计划,确定您可能从中受益的其他内容有点困难。)
答案 1 :(得分:0)
1-您可以使用存储过程来缓存缓存。 2-您可以使用索引视图,这意味着在模式绑定视图上创建索引。 3-您可以在连接中使用查询提示来命令查询优化器使用特殊类型的连接。 4-你可以使用表分区。
答案 2 :(得分:0)
SELECT DISTINCT --#1 - potential bottleneck
ad.award_id
, bl.funding_id
, bl.budget_line
, [month] = dd4.monthnumberofyear
, [year] = dd4.yearcalendar
, Expenditure_value = ISNULL(frb.full_value, '0')
, bl.budget_id
, frb.accode
, [type] = 'Actual'
FROM dbo.dimdate5 dd4
LEFT JOIN dbo.award_data ad ON dd4.fulldate BETWEEN ad.usethisstartdate AND ad.usethisenddate
LEFT JOIN dbo.budget_line bl ON bl.award_id = ad.award_id
LEFT JOIN dbo.fctresearchbalances frb ON frb.el3 = bl.award_id --#2 - join by multiple columns
AND frb.element4groupidnew = bl.budget_line
AND dd4.yearfiscal = frb.yr
AND dd4.monthnumberfiscal = frb.period
答案 3 :(得分:0)
CASE语句可以替换为
COALESCE(frb.full_value,'0') AS Expenditure_value
如果没有更多信息,就不可能确切地说出错误的原因,只是为了给你一些指示。 当你有这么多LEFT JOINS时,连接的顺序可以有所不同。 您是否有标准索引或覆盖包含列的索引? 如果您没有覆盖索引,则主键在连接中很重要。在连接条件中包括所有主键列将加快查询速度。
然后查看您的数据 - 您是否需要基于这些表之间的外键的所有LEFT JOINS?根据您的键,LEFT JOIN可能相当于INNER JOIN。 所有那些LEFT JOINS都有DISTINCT非常有用吗?
你有多少内存?如果你有8GB +那么1.5m的行对于SQL Server来说什么都不是。您需要优化这些连接。