为了提高查询的性能,我创建了一个非规范化索引视图,其中包含一些我需要报告的信息。当我没有获得我期望的性能增益时,我创建了一个带有索引的表格版本,并且性能显着提高。更好的SQL查询性能使用实际非规格化表与索引而不是索引视图?
我应该注意到,当我创建我的视图时,SELECT中有很多ISNULL。我知道,如果这些列以常规观点加入,这些会损害性能,但我的印象是,如果视图被编入索引,则可以。 ISNULLs会成为问题吗?
为了提高查询的性能,我创建了一个非规范化索引视图,其中包含一些我需要报告的信息。当我没有获得我期望的性能增益时,我创建了一个带有索引的表格版本,并且性能显着提高。更好的SQL查询性能使用实际非规格化表与索引而不是索引视图?
我应该注意到,当我创建我的视图时,SELECT中有很多ISNULL。我知道,如果这些列以常规观点加入,这些会损害性能,但我的印象是,如果视图被编入索引,则可以。 ISNULLs会成为问题吗?
你是否索引了你实际选择的列?如果您在查询的索引视图中没有覆盖索引,那么您肯定会发现表格更快。不过,如果你这样做,应该没有真正的区别。例如:
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)
那么相同的查询从持久指数完全服务 - 更快,其实相当的性能从表中进行选择。
什么是SQL Server SKU?只有企业版考虑查询计划中的索引视图。除非选择来自视图并使用NOEXPAND提示,否则标准版不会考虑索引视图。
更新
因为我已经有两个意见表明这是有用的知道,我链接相关MSDN页面Resolving Indexes on Views:
索引视图可以在任何 版的创建SQL Server。在SQL Server 企业版中,查询优化器 会自动考虑索引为 的视图。要在所有 其他版本中使用索引视图,必须使用NOEXPAND表 提示。
这是EE。尽管如此,很高兴知道NOEXPAND提示。 – 2010-01-07 18:04:00
+1:非常有趣的知道 – 2010-01-08 02:43:25
表格和视图是彼此精确匹配的。索引和所有。性能应该不一样吗? – 2010-01-07 17:36:46
否请参阅上面的示例。 – 2010-01-07 17:40:21
非常好的解释。谢谢! – 2010-01-07 17:59:46