7

次のインデックス付きビューを作成したいと思います。

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);

これは正常に機能します。ただし、私が本当にやりたいのは、ビューが照会されている現在の日時の時点で、2日以上前の行のみをこのビューに含めることです。これを行う方法が見つからないのは、Where述語でGetDate()を使用できないためです。これは、非決定論的であるためです。言い換えれば、私はこのようなことをしたいのですが、できません:

Where dbo.Marker.ReadTime >= Convert(dateTime,DateAdd(dd,-2,GetDate()) ,120)

これを回避する方法はありますか?

4

1 に答える 1

13

SCHEMABINDING要件の決定論的関数を回避するつもりはありません。常にエラーが発生します

関数'getdate'は、非決定論的な結果を生成します。決定論的システム関数を使用するか、ユーザー定義関数を変更して決定論的結果を返します。

マーカーが単一のテーブルである場合、インデックス付きビューが、基になるテーブルに同じクラスター化インデックスを持つテーブルに対して、通常のビューよりもパフォーマンス上の利点があるかどうかはわかりません。(ReadTime, EquipmentID)

ただし、「マーカー」自体が、などの複合であるVIEW場合、またはマーカーテーブルのクラスター化インデックスを変更したくない場合は、次のように検討することができます。

  • ReadDateフィルター(vwMarker)なしでスキーマバインドビューを作成する
  • フィルタリングされていないビューにインデックス付きビューを作成します
  • 非決定論的GetDateフィルターを追加する、2番目の非スキーマバインドビューvwMarkerRecentなどを作成します。

ここにSQLフィドルの例

つまり、次のようなものです。

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
于 2011-10-07T11:35:36.883 に答える