使用SQL Server索引视图而不是表

时间:2017-04-11 11:53:43

标签: sql-server indexed-view

我对在SQL Server 2016中使用索引视图感到有些困惑。

这是我的问题。如果我有一个包含大量列的事实表,我创建一个名为IV_Sales的索引视图为

select 
    year, 
    customer, 
    sum(sales) 
from F_Sales 
group by year, customer

我会汇总年度和客户的所有销售额。

之后,当用户从F_sales中运行查询时

Select 
    year, customer, 
    sum(sales) 
from F_sales 
group by year, customer 

优化器(在SQL Server企业版中)会自动使用索引视图IV_sales而不是F_sales的表扫描吗? 我有标准版,当我添加

Select 
    year, 
    customer, 
    sum(sales) 
from F_sales WITH (NOEXPAND) 
group by year, customer

我收到错误,因为没有像我在索引视图上创建的那样的聚簇索引。有没有办法强制使用索引视图而不是标准版中的表?

我的真实世界问题是我有一个指向表F_sales的Cognos Framework模型,当出于性能原因使用Year,customer和sales of sum执行报表时,我希望它自动使用索引视图而不是表格。

我希望我能清楚自己的问题。非常感谢提前。

1 个答案:

答案 0 :(得分:0)

如果您遇到性能问题,索引视图可能是您想要尝试的最后一件事。

你应该先耗尽所有其他途径,比如标准索引。

例如,如果您确定要进行表扫描,那么简单的解决方案是添加非聚集索引以满足查询,以便进行索引扫描或搜索。如果它仍然没有使用它,你需要继续你的性能调整,并弄清楚它为什么不是(不可思考的表达式?陈旧的统计数据?)

非常有限的个案例中,您的索引视图将自动使用(未明确提及索引视图)。您将在查询计划中看到它。

如果您的查询非常接近与索引视图定义匹配,它将使用您的索引视图。

对您的SQL做一个非常小的更改(比如加入另一个表)并且它不会抛出错误,它将回退到不使用索引视图。

像Cognos这样的自动SQL编写工具会很快使SQL无法识别查询规划器,因此不会使用索引视图。

如果您只是打开SSMS并进行一些实验,这一切都很容易验证。

简而言之:使用标准索引,过滤索引,甚至列存储索引(特别适用于事实表,或者我听到的)开始您的选择