我的任务是优化此查询:
Declare @sumBalance NUMERIC = (select SUM(CURRENT_BALANCE) as Balance
from dbo.ACCOUNT_DETAILS)
select @sumBalance
我已经读到聚合函数的最佳解决方案是使用索引视图而不是表。
我已使用SCHEMABINDING:
创建了视图CREATE VIEW dbo.CURRENT_BALANCE_VIEW
WITH SCHEMABINDING
AS
SELECT id,CURRENT_BALANCE
FROM dbo.ACCOUNT_DETAILS
之后我创建了2个索引:
ID
的第一个 CREATE UNIQUE CLUSTERED INDEX index_ID_VIEW ON dbo.View(ID);
CURRENT_BALANCE的第二个我的第二列
CREATE NONCLUSTERED INDEX index_CURRENT_BALANCE_VIEW
ON dbo.CURRENT_BALANCE_VIEW(ID);
在这里我遇到了新查询的麻烦:
Declare @sumBalance NUMERIC = (select SUM(CURRENT_BALANCE) as Balance
from dbo.CURRENT_BALANCE_VIEW)
select @sumBalance
新查询未使用视图
我的索引以某种方式被添加到文件夹Statistics
查看另一篇文章
我不明白为什么我可以看到index&index; current_balance'因为表中没有这样的索引
查看另一篇文章
P.S。已经尝试在表中创建索引并且它有所帮助。它使得查询的工作速度从0.2 Es.operator成本变为0.009,但无论如何它必须更快。
p.s.s很抱歉让你点击链接,我的声誉不允许我正确地过去图像= \
p.s.s.s使用SQL Server 2014
.ss.s.s刚刚意识到我不需要总结0-s。期待他们的格斗功能。
提前致谢。
答案 0 :(得分:1)
此查询:
Declare @sumBalance NUMERIC = (select SUM(CURRENT_BALANCE) as Balance
from dbo.ACCOUNT_DETAILS);
select @sumBalance;
不容易优化。唯一有帮助的指标是:
create index idx_account_details_current_balance on account_details(current_balance);
这是查询的覆盖索引,可用于SUM()
。但是,仍需要扫描索引以执行SUM()
。扫描索引应该比扫描表更快,因为它可能要小得多。
SQL Server 2012+有一个称为列存储索引的工具,它具有相同的效果。
使用索引视图进行聚合功能的建议似乎不是一个好建议。例如,如果上面的查询使用MIN()
或MAX()
,那么上面的索引应该是查询的最佳索引,它应该运行得非常快。
编辑:
您的参考文章非常合理。如果要为此目的创建索引视图,请使用聚合创建。
CREATE VIEW dbo.CURRENT_BALANCE_VIEW
WITH SCHEMABINDING
AS
SELECT SUM(CURRENT_BALANCE) as bal, COUNT_BIG(CURRENT_BALANCE) as cnt
FROM dbo.ACCOUNT_DETAILS;
这有点奇怪,因为它返回一行。我认为以下内容可行:
create index idx_account_details on current_balance_view(bal);
如果没有,您可能需要为索引引入一个虚拟列。
然后:
select *
from dbo.current_balance_view;
应具有预先计算的值。
答案 1 :(得分:1)
如果使用标准版的SQL-Server,则必须使用NOEXPAND-Hint才能使用视图的索引。
例如:
SELECT *
FROM dbo.CURRENT_BALANCE_VIEW (NOEXPAND);