SQL Server - Создание привязанного к схеме индексированного представления с текущим фильтром GetDate - PullRequest
7 голосов
/ 07 октября 2011

Я хочу создать следующее индексированное представление:

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

Это отлично работает. Однако, что я действительно хотел бы сделать, это включить в это представление только те строки, которые имеют двухдневный срок или более новые, начиная с текущей даты / времени, когда запрашивается представление. Я не могу найти способ сделать это, потому что я не могу использовать GetDate () в предикате Where, потому что он недетерминирован. Другими словами, я хотел бы сделать что-то подобное, но не могу:

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

Есть ли способ обойти это?

1 Ответ

13 голосов
/ 07 октября 2011

AFAIK, вы не собираетесь обойти детерминированную функцию для требования SCHEMABINDING.Вы всегда будете получать ошибку

Функция 'getdate' дает недетерминированные результаты.Используйте детерминированную системную функцию или измените пользовательскую функцию для возврата детерминированных результатов.

Если маркер - это всего лишь одна таблица, я не уверен, что индексированное представление будет иметь какое-либо преимущество в производительности по сравнению собычное представление для таблицы с тем же кластеризованным индексом в базовой таблице (ReadTime, EquipmentID)

Однако, если «Маркер» сам по себе является составным, например VIEW, ИЛИ, если вы не хотитеизмените кластеризованный индекс в таблице маркеров, тогда вы можете рассмотреть что-то вроде:

  • Создать представление с привязкой к схеме без фильтра ReadDate (vwMarker)
  • Создать индексированное представление на нефильтрованномview
  • Создайте второе не привязанное к схеме представление vwMarkerRecent или подобное, которое добавляет недетерминированный фильтр GetDate.

Пример Sql Fiddle здесь

т.е. что-то вроде:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...