带有datepart的索引视图,对datepart的查询未使用索引

时间:2016-11-12 11:55:20

标签: sql-server sql-server-2008 tsql indexed-view

我需要在RewriteEngine On RewriteCond %{QUERY_STRING} ^key_=(.*)$ RewriteRule ^(.*)$ snapshots/%1.html [R=301,QSD] 和/或月份之前,在一个有数百万行的表上进行查询,这是一个非常强大的CPU。

我尝试使用带有datepart列的索引视图,甚至在索引视图本身的datepart(day, BornDate)列上创建非聚簇索引。但执行计划仍告诉我,查询是使用基础表上的datepart(day, BornDate)计算的。

我运行的查询如下:

datepart

我将它与针对基础表的相同查询进行比较:

set statistics time on
SELECT count(1) FROM [dbo].[DemandsBornDateParts] where borndateday = 5 OPTION (RECOMPILE)
set statistics time off

它们都显示几乎相同的查询计划,几乎相同的子树成本,CPU和已用时间,都使用谓词set statistics time on select count(1) from dbo.Demands where DAY(borndate) = 5 set statistics time off 进行聚簇索引扫描

视图的定义如下:

datepart(day,[dbo].[Demands].[BornDate])=(5)

如何在不重复计算GO --Set the options to support indexed views. SET NUMERIC_ROUNDABORT OFF; SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON; GO --Create view with schemabinding. IF OBJECT_ID ('dbo.DemandsBornDateParts', 'view') IS NOT NULL DROP VIEW dbo.DemandsBornDateParts ; GO CREATE VIEW dbo.DemandsBornDateParts WITH SCHEMABINDING AS SELECT id, Datepart(DAY, borndate) AS BornDateDay, Datepart(MONTH, borndate) AS BornDateMonth, Datepart(YEAR, borndate) AS BornDateYear FROM DBO.demands GO --Create an index on the view. CREATE UNIQUE CLUSTERED INDEX [PK_dbo.DemandsBornDateParts] ON dbo.DemandsBornDateParts (Id); GO CREATE NONCLUSTERED INDEX [IX_BornDateDay] ON [dbo].[DemandsBornDateParts] ( [BornDateDay] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO 的情况下使用持久/索引列?我不能使用持久化列,我需要使用视图。

1 个答案:

答案 0 :(得分:4)

在查询中的视图名称后面添加WITH(NOEXPAND)。来自Table Hints的文档:

  

<强> NOEXPAND

     

指定在查询优化器处理查询时,不扩展任何索引视图以访问基础表。查询优化器将视图视为具有聚簇索引的表。 NOEXPAND仅适用于索引视图。

来自同一页面上的Remarks on Using NOEXPAND

  

要强制优化器为索引视图使用索引,请指定NOEXPAND选项。