it-swarm-eu.dev

Sollte ich viele einzelne Feldindizes anstelle bestimmter mehrspaltiger Indizes verwenden?

Diese Frage bezieht sich auf die Wirksamkeit einer SQL Server-Indizierungstechnik. Ich denke, es ist als "Indexschnittpunkt" bekannt.

Ich arbeite mit einer vorhandenen SQL Server-Anwendung (2008), die eine Reihe von Leistungs- und Stabilitätsproblemen aufweist. Die Entwickler haben einige seltsame Dinge mit der Indizierung gemacht. Ich konnte weder schlüssige Benchmarks zu diesen Themen erhalten, noch kann ich eine wirklich gute Dokumentation im Internet finden.

Es gibt viele durchsuchbare Spalten in einer Tabelle. Die Entwickler haben für JEDE der durchsuchbaren Spalten einen einzelnen Spaltenindex erstellt. Die Theorie war, dass SQL Server in der Lage sein würde, jeden dieser Indizes zu kombinieren (zu schneiden), um unter den meisten Umständen effizient auf die Tabelle zuzugreifen. Hier ist ein vereinfachtes Beispiel (echte Tabelle hat mehr Felder):

CREATE TABLE [dbo].[FatTable](
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [col1] [nchar](12) NOT NULL,
    [col2] [int] NOT NULL,
    [col3] [varchar](2000) NOT NULL, ...

CREATE NONCLUSTERED INDEX [IndexCol1] ON [dbo].[FatTable]  ( [col1] ASC )
CREATE NONCLUSTERED INDEX [IndexCol2] ON [dbo].[FatTable] ( [col2] ASC )

select * from fattable where col1 = '2004IN' 
select * from fattable where col1 = '2004IN' and col2 = 4

Ich denke, dass mehrere Spaltenindizes, die auf Suchkriterien abzielen, viel besser sind, aber ich kann mich irren. Ich habe Abfragepläne gesehen, die zeigen, dass SQL Server bei zwei Indexsuchen eine Hash-Übereinstimmung ausführt. Vielleicht ist dies sinnvoll, wenn Sie nicht wissen, wie die Tabelle durchsucht wird? Vielen Dank.

36
RaoulRubin

Was Sie brauchen, sind , die Indizes abdecken, dh. Indizes, die eine Abfrage selbst erfüllen können. Ein 'abdeckender' Index hat jedoch ein Problem: Er deckt eine bestimmte Abfrage ab . Um eine gute Indizierungsstrategie zu entwickeln, müssen Sie Ihre Arbeitslast verstehen: Welche Abfragen treffen die Datenbank, welche sind kritisch und welche sind nicht, wie oft jeder Abfragetyp ausgeführt wird, usw. usw. usw. Und dann gleichen Sie dies mit den Schreib- und Aktualisierungskosten jedes Index ab, und dort haben Sie Ihre Indexierungsstrategie. Wenn es kompliziert klingt, liegt das daran, dass es kompliziert ist.

Sie können jedoch einige Faustregeln anwenden. Das MSDN deckt die Grundlagen recht gut ab:

Es gibt auch eine Vielzahl von Artikeln, die von der Community beigesteuert wurden, z. Webcast-Aufzeichnung - DBA Darwin Awards: Index Edition .

Und um Ihre Frage speziell zu beantworten: Separate Indizes für jede Spalte können funktionieren, vorausgesetzt, jede Spalte hat eine hohe Selektivität (viele unterschiedliche Werte, wobei jeder Wert nur einige Male in der Datenbank vorkommt). Der resultierende Zugriffsplan mit Hash-Join zwischen zwei Indexbereichs-Scans funktioniert normalerweise recht gut. Spalten mit geringer Selektivität (wenige unterschiedliche Werte, jeder Wert wird mehrmals in der Datenbank angezeigt) sind für sich genommen nicht sinnvoll. Der Abfrageoptimierer ignoriert sie einfach. Spalten mit niedriger Selektivität sind jedoch oftmals gute zusammengesetzte Schlüssel, wenn sie mit einer Spalte mit hoher Selektivität gepaart werden.

39
Remus Rusanu