我对在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执行报表时,我希望它自动使用索引视图而不是表格。
我希望我能清楚自己的问题。非常感谢提前。
答案 0 :(得分:0)
如果您遇到性能问题,索引视图可能是您想要尝试的最后一件事。
你应该先耗尽所有其他途径,比如标准索引。
例如,如果您确定要进行表扫描,那么简单的解决方案是添加非聚集索引以满足查询,以便进行索引扫描或搜索。如果它仍然没有使用它,你需要继续你的性能调整,并弄清楚它为什么不是(不可思考的表达式?陈旧的统计数据?)
在非常有限的个案例中,您的索引视图将自动使用(未明确提及索引视图)。您将在查询计划中看到它。
如果您的查询非常接近与索引视图定义匹配,它将使用您的索引视图。
对您的SQL做一个非常小的更改(比如加入另一个表)并且它不会抛出错误,它将回退到不使用索引视图。
像Cognos这样的自动SQL编写工具会很快使SQL无法识别查询规划器,因此不会使用索引视图。
如果您只是打开SSMS并进行一些实验,这一切都很容易验证。
简而言之:使用标准索引,过滤索引,甚至列存储索引(特别适用于事实表,或者我听到的)开始您的选择