使用带索引的实际非规范化表而不是索引视图,会提高SQL查询性能吗?

使用带索引的实际非规范化表而不是索引视图,会提高SQL查询性能吗?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,为了提高查询的性能,我创建了一个非规范化的索引视图,其中包含一些我需要报告的信息。当我没有获得我所希望的性能提升时,我创建了一个带有索引的表版本的视图,并获得了显著更好的性能 我应该注意,当我创建我的视图时,SELECT中有很多ISNull。我知道,如果在常规视图中连接这些列,可能会影响性能,但我的印象是,如果对视图进行索引,就可以了。ISNULLs可能是问题所在吗?您是否为实际选择的列编制了索引?如果查询的索引视图上没有覆盖索引,那么肯定会发现表更快。但是,如果你这样做了,就不会有真正的区别。

为了提高查询的性能,我创建了一个非规范化的索引视图,其中包含一些我需要报告的信息。当我没有获得我所希望的性能提升时,我创建了一个带有索引的表版本的视图,并获得了显著更好的性能


我应该注意,当我创建我的视图时,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?只有Enterprise Edition考虑查询计划中的索引视图。标准版本不会考虑索引视图,除非选择来自视图,并且使用No展开提示。

更新

由于我已经收到两条评论,表明这是有用的,我正在链接相关的MSDN页面:

可以在任何位置创建索引视图 SQL Server版本。在SQL Server中 企业,查询优化器 自动考虑索引 看法在所有视图中使用索引视图的步骤 其他版本,NOEXPAND表 必须使用提示


表和视图完全匹配。索引和所有。性能不应该是相同的吗?我假设如果col3是一个包含的列,我们仍然可以看到与从表中选择相同的性能?在本例中,是的。这就是重点。如果您有一个覆盖索引,那么所有内容都将从该索引中提供,该索引将被持久化。如果不这样做,那么视图至少有一部分是通过动态查询基础表和派生字段来确定的,这就是EE。很高兴知道NOEXPAND提示。