SQL Server - 使用当前 GetDate 筛选器创建架构绑定索引视图
Posted
技术标签:
【中文标题】SQL Server - 使用当前 GetDate 筛选器创建架构绑定索引视图【英文标题】:SQL Server - Creating a Schema Bound Indexed View with a current GetDate filter 【发布时间】:2011-12-02 22:34:37 【问题描述】:我想创建以下索引视图:
CREATE VIEW [Cic].[vwMarker] WITH SCHEMABINDING
AS
Select
SubId,
marker.EquipmentID,
marker.ReadTime,
marker.CdsLotOpside,
marker.CdsLotBackside,
marker.CdteLotOpside,
marker.CdTeLotBackside
From dbo.Marker
Where dbo.Marker.ReadTime >= Convert(dateTime,'10/5/2011',120)
GO
CREATE UNIQUE CLUSTERED INDEX IX_vwMarker_ReadTime_EquipmentID
ON Cic.vwMarker (ReadTime, EquipmentID);
这很好用。但是,我真正想做的是仅在此视图中包含两天或更晚的行,截至当前日期/时间查询视图。我找不到这样做的方法,因为我不能在 Where 谓词中使用 GetDate(),因为它是不确定的。换句话说,我想做这样的事情,但不能:
Where dbo.Marker.ReadTime >= Convert(dateTime,DateAdd(dd,-2,GetDate()) ,120)
有没有办法解决这个问题?
【问题讨论】:
【参考方案1】:AFAIK 你不会绕过 SCHEMABINDING 要求的确定性函数。你总是会收到错误
函数“getdate”产生不确定的结果。使用确定性系统函数,或修改用户定义的函数以返回确定性结果。
如果 Marker 只是一个表,我不确定索引视图相对于在(ReadTime, EquipmentID)
基础表上具有相同聚集索引的表是否比普通视图具有任何性能优势
但是,如果“Marker”本身是一个组合,例如 VIEW
,或者如果您不想更改 Marker 表上的聚簇索引,那么您可以考虑如下:
GetDate
过滤器。
Sql Fiddle example here
即比如:
CREATE VIEW [Cic].[vwMarker] WITH SCHEMABINDING
AS
Select
SubId,
marker.EquipmentID,
marker.ReadTime,
marker.CdsLotOpside,
marker.CdsLotBackside,
marker.CdteLotOpside,
marker.CdTeLotBackside
From dbo.Marker
-- Add only Deterministic where filters here
GO
CREATE UNIQUE CLUSTERED INDEX IX_vwMarker ON Cic.vwMarker (ReadTime, EquipmentID)
GO
CREATE VIEW [Cic].[vwRecentMarker] -- Not Schema Bound
AS
Select
vm.SubId,
vm.EquipmentID,
vm.ReadTime,
vm.CdsLotOpside,
vm.CdsLotBackside,
vm.CdteLotOpside,
vm.CdTeLotBackside
From cic.vwMarker vm
Where vm.ReadTime >= Convert(dateTime,DateAdd(dd,-2,GetDate()) ,120)
GO
【讨论】:
以上是关于SQL Server - 使用当前 GetDate 筛选器创建架构绑定索引视图的主要内容,如果未能解决你的问题,请参考以下文章