未经索引的视图v / s查询

时间:2014-04-07 22:12:12

标签: sql sql-server indexing sql-server-2012

我正在创建一个视图,其中包含在SQL Server 2012上跟随SQL查询时指定的子查询。

CREATE VIEW [dbo].[VIEW_Detail] WITH SCHEMABINDING
AS
SELECT a.ID, a.Name1, a.Name2,
       STUFF
          ((SELECT        CAST(',' AS varchar(max)) + t .Name1
            FROM            dbo.Synonyms AS s 
            INNER JOIN dbo.Details AS t ON s.SynonymTSN = t .TSN
            WHERE        s.oID= a.ID FOR XML PATH('')), 1, 1, '') AS Synonym
FROM    a.Details
WHERE   (a.Rank <= 100)

由于定义包含子查询,因此我无法创建索引视图。如果我的表被索引,使用查询而不是视图来检索数据会更快。或者,无索引的视图仍将比使用查询更好地执行。该视图当前包含超过50,000行。我可以使用哪些其他查询优化?

PS:我不关心插入/更新的性能

1 个答案:

答案 0 :(得分:0)

视图只是使用名称保存的单个SELECT语句(即视图名称),使用特定查询的视图没有性能优势。

是索引视图可以提高性能,但它们带有一长串限制。实现它们时,其他不调用此索引视图但可以从此视图上定义的索引中受益的查询将使用这些索引。

在您的情况下,您有一个子查询并且还使用FOR XML子句,它们都不允许在索引视图中。

要优化查询,您需要先查看执行计划,然后查看查询是否正在执行表或聚簇索引扫描。尝试添加一些索引并尝试获取搜索而不是扫描。

查看此查询,我认为如果TSNIDRANK列的dbo.Details表和SynonymTSN列{{1}表,它可以提高此查询的性能。

另一方面,只要您在这两个表上定义了主键,50,000行就不是很多行,您应该通过非常简单的查询获得合理的性能。