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 表上的聚簇索引,那么您可以考虑如下:

创建不使用 ReadDate 过滤器 (vwMarker) 的架构绑定视图 在未过滤的视图上创建索引视图 创建第二个非架构绑定视图 vwMarkerRecent 等,它添加了非确定性 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 筛选器创建架构绑定索引视图的主要内容,如果未能解决你的问题,请参考以下文章

sql server 日期 查询技巧

sql中怎么取得当前时间

一年又36个旬,想问下SQL SERVER如何判断当前日期是第几个旬

20180928 SQL SERVER 基本函数--时间

sql server 获取指定格式的当前日期

如何在 sql server 2008 中将日期与 GETDATE() 进行比较