索引视图。查询忽略视图并使用表格

时间:2015-11-13 11:56:10

标签: sql sql-server indexing views indexed-view

我的任务是优化此查询:

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
  1. 新查询未使用视图

    http://i.stack.imgur.com/jlPEd.png

  2. 我的索引以某种方式被添加到文件夹Statistics

    查看另一篇文章

  3. 我不明白为什么我可以看到index&index; current_balance'因为表中没有这样的索引

  4. 查看另一篇文章

    P.S。已经尝试在表中创建索引并且它有所帮助。它使得查询的工作速度从0.2 Es.operator成本变为0.009,但无论如何它必须更快。

    p.s.s很抱歉让你点击链接,我的声誉不允许我正确地过去图像= \

    p.s.s.s使用SQL Server 2014

    .ss.s.s刚刚意识到我不需要总结0-s。期待他们的格斗功能。

    提前致谢。

2 个答案:

答案 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);