2010-01-07 38 views
3

为了提高查询的性能,我创建了一个非规范化索引视图,其中包含一些我需要报告的信息。当我没有获得我期望的性能增益时,我创建了一个带有索引的表格版本,并且性能显着提高。更好的SQL查询性能使用实际非规格化表与索引而不是索引视图?

我应该注意到,当我创建我的视图时,SELECT中有很多ISNULL。我知道,如果这些列以常规观点加入,这些会损害性能,但我的印象是,如果视图被编入索引,则可以。 ISNULLs会成为问题吗?

回答

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) 

那么相同的查询从持久指数完全服务 - 更快,其实相当的性能从表中进行选择。

+0

表格和视图是彼此精确匹配的。索引和所有。性能应该不一样吗? – 2010-01-07 17:36:46

+0

否请参阅上面的示例。 – 2010-01-07 17:40:21

+0

非常好的解释。谢谢! – 2010-01-07 17:59:46

1

什么是SQL Server SKU?只有企业版考虑查询计划中的索引视图。除非选择来自视图并使用NOEXPAND提示,否则标准版不会考虑索引视图。

更新

因为我已经有两个意见表明这是有用的知道,我链接相关MSDN页面Resolving Indexes on Views

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

+0

这是EE。尽管如此,很高兴知道NOEXPAND提示。 – 2010-01-07 18:04:00

+0

+1:非常有趣的知道 – 2010-01-08 02:43:25