我需要在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
的情况下使用持久/索引列?我不能使用持久化列,我需要使用视图。
答案 0 :(得分:4)
在查询中的视图名称后面添加WITH(NOEXPAND)
。来自Table Hints的文档:
<强> NOEXPAND 强>
指定在查询优化器处理查询时,不扩展任何索引视图以访问基础表。查询优化器将视图视为具有聚簇索引的表。 NOEXPAND仅适用于索引视图。
来自同一页面上的Remarks on Using NOEXPAND:
要强制优化器为索引视图使用索引,请指定NOEXPAND选项。