2017-05-03 3 views
2

Ich habe DeletedDate Spalten in meinen Tabellen und wann immer ich Abfragen für diese Tabellen schreibe, überprüfe ich normalerweise, um sicherzustellen, DeletedDate IS NULL. Mein Gedanke war, dass, wenn ich eine indizierte, persistente, berechnete Spalte mit der Bezeichnung IsDeleted erstelle, dass sie meine Abfragen beschleunigen könnte, da sie nur einen einzelnen Bitwert überprüfen müsste, statt jedoch eine Reihe von Daten zu indizieren.Erstelle ich eine indizierte berechnete Spalte, um nach Nullen zu suchen, kauf mir irgendwas?

[IsDeleted] AS (isnull(CONVERT([bit],case when [DeletedDate] IS NULL then (0) else (1) end),(0))) PERSISTED NOT NULL, 

jedoch sah ich den Ausführungsplan und es scheint, dass es sieht immer noch an der DeletedDate Säule (wie ich glaube, ich könnte den Plan falsch liest).

Macht es etwas zu kaufen oder gibt es einen anderen Weg, um es für Abfragen zu beschleunigen, die nur darauf achten, ob die Spalte null ist oder nicht?

+0

Welcher Anteil der Datensätze wird gelöscht? –

+0

@GordonLinoff sehr wenige im Moment, aber wir haben die App noch nicht vollständig entweder – adam0101

+0

Wenn das ein Fall ist, dann suchen Sie nach einer Leistungsverbesserung an einer Stelle, wo Sie noch nicht wissen, dass Sie ein Leistungsproblem haben anfangen mit. Das ist die Definition der vorzeitigen Optimierung. Wenn Sie nach reinem enzyklopädischem Wissen fragen, befürchte ich, dass der beste Weg, eine Antwort zu finden, darin besteht, es selbst zu versuchen und zu messen. –

Antwort

0

Ein Index auf DeletedDate wird (unter den meisten Umständen) nur dann nützlich sein, wenn die allermeisten Zeilen nicht gelöscht werden. Warum? Denn wenn viele Datensätze gelöscht werden, wird fast jede Datenseite gelöschte und nicht gelöschte Datensätze enthalten.

Der Index verringert nicht die Anzahl der Seiten, die gelesen werden müssen. Unter diesen Umständen ist das Scannen der Daten normalerweise schneller.

Eine wichtige Ausnahme ist ein gruppierter Index, bei dem DeletedDate die erste Spalte ist (oder ein Löschkennzeichen, das von dieser Spalte abgeleitet wird). In diesem Fall sind die nicht gelöschten Datensätze und die gelöschten Datensätze fast immer auf verschiedenen Datenseiten. Wenn also 5% der Datensätze gelöscht werden, müssten Sie nur etwa 5% der Daten lesen.

Natürlich gibt es Overhead mit einem gruppierten Index. Wenn ein Datensatz gelöscht wird, wird der Datensatz tatsächlich in den Datenbanken verschoben - was zu mehreren Lese-/Schreibvorgängen führt und das Potenzial für eine Fragmentierung erhöht. Ob ein Clustered-Index verwendet wird oder nicht, ist den zusätzlichen Aufwand wert. Dies hängt davon ab, wie Sie die Daten verwenden, wie häufig die Aktualisierungen durchgeführt werden und andere ähnliche Faktoren.

+0

Die große Mehrheit der Zeilen _are_ wird nicht gelöscht (null DeletedDate). Daher ist es gut zu wissen, dass ein Index für DeletedDate beim Filtern dieser Spalte in meinen Abfragen hilfreich ist, aber Sie haben die berechnete Spalte in Ihrer Antwort nicht erwähnt. Würde eine indizierte berechnete Spalte überhaupt helfen? – adam0101

+0

Ein gefilterter Index könnte. Ein Großteil dieser Diskussion hängt von der tatsächlichen Abfrage oder den Abfragen ab, die Sie verwenden. Und vergiss nicht, dass nichts frei ist. Sie zahlen für den Index, wenn Sie Zeilen ändern. Wenn Sie wirklich wissen wollen, gibt es nur eine Antwort - versuchen Sie es und vergleichen Sie die Pläne. – SMor

Verwandte Themen