2016-05-17 16 views
2

Ich versuche eine indizierte Sicht zu erstellen, die nur die Daten der letzten zwei Wochen enthält.Indexierte Ansicht mit Daten der letzten zwei Wochen

Dieses Teil funktioniert gut:

CREATE VIEW [dbo].[MainLogView] 
WITH SCHEMABINDING 
AS 
SELECT  Id, Date, System, [Function], StartTime, EndTime, Duration, ResponseIsSuccess, ResponseErrors 
FROM   dbo.MainLog 
WHERE  (Date >= DATEADD(day, - 14, GETDATE())) 

Aber wenn ich versuche hinzufügen Index:

CREATE UNIQUE CLUSTERED INDEX IDX_V1 
    ON MainLogView (Id); 

Ich bin geting:

Kann nicht Index auf Sicht erstellen ‚dbo.MainLogView ". Die Funktion 'getdate' liefert nichtdeterministische Ergebnisse. Verwenden Sie eine deterministische Systemfunktion, , oder ändern Sie die benutzerdefinierte Funktion, um deterministische Ergebnisse zurückzugeben.

Ich weiß, warum, aber wie die Daten in einer Ansicht für die letzten 2 Wochen zu reduzieren? Ich brauche kleine und schnell abrechenbare Daten aus meiner Tabelle.

+0

Sie können nicht. Die Pflege einer indizierten Sicht wird effektiv durch Trigger gegen die Basistabellen durchgeführt und basiert ausschließlich auf den Zeilen, die von den einzelnen Aktionen in diesen Basistabellen betroffen sind (daher alle ihre Einschränkungen). Die letzten zwei Wochen erfordern einen alternativen Wartungsmechanismus, der in SQL Server nicht vorhanden ist. –

+0

Warum erstellen Sie einen Index für ID – TheGameiswar

+0

@TheGameiswar, weil ich es testen möchte. Erste Kolumne. In diesem Fall ist es vernachlässigbar. Beceuse es funktioniert nicht. – BWA

Antwort

2

Sie könnten (ich denke, aber ich habe keine reale Erfahrung mit indizierten Sichten) eine Datensatztabelle erstellen (eine tatsächliche Tabelle, da eine Ansicht in einer indizierten Sicht nicht zulässig ist), die Sie mit dem aktuellen Datum füllen - 14 Tage. Diese Tabelle können Sie auf dem neuesten Stand halten; entweder manuell, mit einem Trigger oder einem anderen cleveren Mechanismus. Sie können diese Tabelle zum Verbinden verwenden und sie als Filter verwenden.

Natürlich, wenn Sie die Ansicht abfragen, müssen Sie sicher sein, Ihre 'currentDate' Tabelle zuerst zu aktualisieren!

Sie würden so etwas bekommen:

CREATE VIEW [dbo].[MainLogView] 
WITH SCHEMABINDING 
AS 
SELECT  Id, Date, System, [Function], StartTime, EndTime, Duration, ResponseIsSuccess, ResponseErrors 
FROM   dbo.MainLog ML 
INNER JOIN  dbo.CurrentDate CD 
      ON ML.Date >= CD.CurrentDateMin14Days 

(Völlig ungetestet, könnte funktionieren nicht ... Dies ist im Grunde ein Hack, ich bin nicht sicher, ob die indizierte Sicht geben Sie eine Leistungssteigerung. Sie könnten mit einer normalen Ansicht besser dran sein.)

+0

Clever, ich werde es testen. – BWA

+0

Works, index erstellt ;-) Ich muss es komplexer testen. – BWA

+0

@BWA Cool, vergessen Sie nicht, die Leistung zu überprüfen. Sie könnten mit einer weniger Hacky-Methode besser dran sein. – HoneyBadger

Verwandte Themen