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

时间:2010-01-07 16:47:06

标签: sql sql-server sql-server-2005

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

我应该注意,当我创建视图时,SELECT中有很多ISNULL。我知道如果这些列在常规视图中加入,这些可能会损害性能,但我认为如果视图已编入索引就可以了。 ISNULL可能是问题吗?

2 个答案:

答案 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表   必须使用提示。