SQL-gefilterte Indizes: Soll ich für optionale Spalten immer einen Filter auf einen Index setzen?

9

Gibt es für 'große' Tabellen einen Grund, die Indizes für optionale Spalten nicht zu filtern?

Also für einen Index auf Spalte AAA (weil Leute AAA suchen können),
Ich kann den Filter auf ([AAA] IS NOT NULL) setzen.
Das spart Speicher, spart also Geld.

Einige weitere Vorteile von technet :

  • Verbesserte Abfrageleistung und Planqualität
  • Reduzierte Indexwartungskosten
  • Reduzierte Indexspeicherkosten

Die Leute sagen, dass es gut ist, einen Filter auf einen Index für Spalten zu setzen, die meistens leer sind. Aber warum sollte ich keinen Filter auf Indizes für Spalten setzen, die für 1% leer sind? Gibt es einen Grund, es nicht zu tun, wenn es nur Vorteile hat?

    
Erik Dekker 11.05.2012, 08:58
quelle

2 Antworten

5

Das ist normalerweise eine gute Idee mit zwei Problemen:

  1. Der Tischdesigner hat einen Bug (nur vor Denali!). Wenn es eine Tabelle neu erstellt, löscht es alle Filter.
  2. Stellen Sie sicher, dass das Optimierungsprogramm statisch feststellen kann, dass Ihr Prädikat niemals Nullzeilen zurückgeben kann. In der Regel ist dies aufgrund der SQL NULL-Semantik der Fall (im Grunde der einzige Fall, in dem sie helfen statt zu behindern). Beispiel: select distinct col from T wird den Index nicht verwenden, da möglicherweise ein Nullwert gefunden wird. Verwenden Sie dies: select distinct col from T where col is not null .

Gefilterte Indizes werden zu wenig genutzt. Sie können sogar verwendet werden, um eine NULL-fähige Spalte eindeutig zu machen.

Meine praktische Empfehlung: Probieren Sie es einfach für ein paar Monate aus und lernen Sie selbst, ob es weitere unvorhergesehene Probleme gibt.

Wenn Sie mit erweiterten Abfragetechniken für SQL Server arbeiten, sehen Sie auch Anzeigen mit indizierten Sichten. Es gibt eine Reihe von gefilterten Indizes (zumindest für Enterprise).

    
usr 11.05.2012, 10:00
quelle
0

Alle Indizes haben Vor- und Nachteile: Nachteile:

  1. Sie belegen Festplattenspeicher
  2. sie müssen gepflegt werden (das Gleichgewicht von Der Indexbaum muss regelmäßig neu strukturiert werden, um sicherzustellen, dass Abfrageoptimierung verwendet keine bum-Datenverteilung), die möglicherweise bedeutet, sie müssen aus der Bahn geworfen werden - schlechte Nachrichten, wenn sie beschäftigt sind
  3. sie brauchen Zeit, um im laufenden Betrieb zu aktualisieren, wenn häufige Einfügungen auftreten

Vorteile:

  1. Richtig entworfen, können sie teure Tabellenscans beseitigen
  2. Richtig gestaltet, (ein Deckungsindex) können sie jede gelesene Tabelle beseitigen.

Wie es normalerweise kommt, kommt es darauf an.

  1. Zu viele Indizes können das Schreiben von Performance drastisch verlangsamen
  2. Zu viele Indizes können die Verwendung von dispace drastisch erhöhen
  3. Nicht der richtige Index kann die Leseleistung drastisch verringern

Manche Leute verdienen sehr viel davon, ihre Sachen über Indizes wirklich zu kennen: Es gibt unglaublich gute Sachen hier Ссылка

Es hängt also davon ab, wie oft Benutzer Daten zurückgeben, auf die der Index verweist, und wie oft sie die über den Index enthaltenen Daten aktualisieren.

Die Indizes für dünn besetzte Spalten unterscheiden sich nicht. Wenn die Spalte jedoch (weitgehend) leer ist, sind gefilterte Indizes effizienter. Sobald die Seltenheit abnimmt (z. B. 50/50), kann die Verteilung der Daten sehr wichtig werden, wenn der Optimierer den besten Plan zum Zurückgeben der Daten entscheidet. Ein gefilterter Index wird die Verteilung für Daten außerhalb des Filters nicht kennen - offensichtlich, aber es muss gesagt werden.

    
Ian P 11.05.2012 09:49
quelle