为了提高查询的性能,我创建了一个非规范化的索引视图,其中包含了我需要报告的一些信息。当我没有获得我希望的性能提升时,我使用索引创建了我的视图的表格版本,并获得了明显更好的性能。
我应该注意,当我创建视图时,SELECT中有很多ISNULL。我知道如果这些列在常规视图中加入,这些可能会损害性能,但我认为如果视图已编入索引就可以了。 ISNULL可能是问题吗?
答案 0 :(得分:4)
您是否将实际选择的列编入索引?如果您的查询的索引视图上没有覆盖索引,那么您肯定会发现表更快。但是,如果你这样做,应该没有真正的区别。例如:
CREATE VIEW dbo.denormalized
WITH SCHEMABINDING
AS
SELECT A.id,
A.col1,
A.col2,
ISNULL(B.col3, '') col3
FROM dbo.A LEFT JOIN dbo.B ON A.Bid = B.id
GO
CREATE UNIQUE CLUSTERED INDEX UIX_denormlaized
ON dbo.denormalized (id)
到目前为止一切顺利。现在,我们尝试从这个视图中选择如下:
SELECT id, col3 FROM denormalized
此视图的唯一持久数据是ID列上的索引 - 剩余部分必须在运行中进行锻炼。因此,每行再次计算ISNULL。但是,如果我们添加此索引:
CREATE INDEX IX_denormalized
ON dbo.denormalized (id, col3)
然后完全从持久化索引中提供相同的查询 - 更快,实际上与从表中选择的性能相当。
答案 1 :(得分:1)
什么是SQL Server SKU?只有Enterprise Edition才会考虑查询计划中的索引视图。标准版不会考虑索引视图,除非select来自视图并使用NOEXPAND提示。
<强>更新强>
由于我已经收到两条评论,表明这是有用的,我正在链接相关的MSDN页面Resolving Indexes on Views:
可以在任何位置创建索引视图 SQL Server版。在SQL Server中 企业,查询优化器 自动考虑索引 视图。在所有中使用索引视图 其他版本,NOEXPAND表 必须使用提示。