2011-10-07 2 views
6

voglio creare la seguente vista indicizzata:SQL Server - Creazione di uno schema Bound vista indicizzata con un filtro GetDate corrente

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

Questo funziona bene. Tuttavia, ciò che mi piacerebbe davvero fare è includere solo righe in questa vista che sono vecchie di due giorni o più recenti, a partire dalla data/ora corrente in cui viene interrogata la vista. Non riesco a trovare un modo per farlo perché non posso usare GetDate() nel predicato Where perché non è deterministico. In altre parole, mi piacerebbe fare qualcosa del genere, ma non posso:

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

C'è un modo per aggirare questo?

risposta

11

AFAIK non si ha intenzione di aggirare la funzione deterministica per il requisito SCHEMABINDING. Riceverai sempre l'errore

La funzione 'getdate' restituisce risultati non deterministici. Utilizzare una funzione di sistema deterministica o modificare la funzione definita dall'utente per restituire risultati deterministici.

Se Marker è solo una singola tabella, non sono sicuro che una vista indicizzata avrebbe alcun miglioramento delle prestazioni su una vista normale contro il tavolo con lo stesso indice cluster nella tabella sottostante di (ReadTime, EquipmentID)

Tuttavia, se "Marker" è di per sé un composito come ad esempio un VIEW, o se non si desidera modificare l'indice cluster sul tavolo Marker, allora si potrebbe prendere in considerazione qualcosa di simile:

  • Creare una vista schema rilegato senza il filtro ReadDate (vwMarker)
  • Creare la vista indicizzata sulla vista non filtrata
  • Creare una seconda vista non associata allo schema vwMarkerRecent o simile, che aggiunge nel filtro non deterministico GetDate.

Sql Fiddle example here

cioè Qualcosa di simile:

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