Sollte ich einen nicht gruppierten Index für alle durchsuchbaren Spalten oder nur für jede Spalte separat erstellen?
On Februar 15, 2021 by adminIch bin nicht sicher, ob ich nicht gruppierte Indizes richtig verwenden soll. Der SSMS-Planschätzer soll einen weiteren Index hinzufügen, wenn der folgende Index bereits in der Tabelle enthalten ist.
CREATE NONCLUSTERED INDEX [ix_zone_fetch_shipping] ON [dbo].[tbl_shipping_rates_zones] ( [iso] ASC, [mzone] ASC, [postal] ASC ) INCLUDE ( [region], [zone_dom], [zone_emi], [zone_pmi], [zone_fci], [zone_ups], [zone_fed] )
Meine Abfrage war
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
Meine Frage ist … sollte ich einen Index für alle möglichen Suchschlüssel erstellen? Ich suche nach mzone, iso und postal in verschiedenen Abfragen.
Danke
Kommentare
- Schließen Sie jede Spalte aus ein die Tabelle?
- Ja, ich schließe jede Spalte ein.
- Das Einfügen aller Spalten in einen einzelnen Index wird nicht viel helfen – ein solcher Index verdoppelt im Grunde genommen den Platzbedarf. und zweitens kann es immer nur für die n Spalten ganz links verwendet werden – es macht NICHT die Suche nach der 17. Spalte in Ihrer Tabelle auf magische Weise schneller.
- Und mit a Ein separater Index für jede Spalte – nur weil Sie eines Tages möglicherweise danach suchen – ist ebenfalls nicht sehr gut. Ein Index kostet Sie – in Bezug auf die Leistung bei jedem Einfügen, Aktualisieren und Löschen. Don ' t overindex – das ' ist fast schlimmer, als überhaupt keine Indizes zu haben ….
- Vielen Dank für diese Kommentare @marc_s, das ist genau die Information, nach der ich gesucht habe. Ist es auch angebracht zu sagen, dass es eine gute Auswahl an nicht gruppierten Indizes gibt (z. B. zwischen 5 und 10), oder ist dies nur relativ zu den Anforderungen der Tabelle? Wenn ja, auf welche Art von Dingen ist es relativ?
Antwort
SQL Server zeigt Ihnen einen Index an es würde gerne verwenden, da es schätzt, dass der Index das Leben leichter machen würde. Es ist sicherlich nicht erforderlich, für jedes durchsuchbare Feld einen Index zu erstellen. Dadurch wird die Schreibleistung erheblich beeinträchtigt. Wenn Sie weniger als 5 bis 10 Indizes für die angegebene Tabelle haben und diese Abfrage ständig ausführen, möchten Sie den vorgeschlagenen Index wahrscheinlich genau so hinzufügen, wie SSMS ihn anzeigt.
JNK“ s Bearbeiten unten
Es ist auch wichtig, die vorgeschlagenen Indizes zusammen zu betrachten. Die Vorschläge befinden sich sozusagen alle in Silos, sodass ein ganzer vorgeschlagener Index durch Hinzufügen eines INCULDE
d-Felds zu einem anderen Index ersetzt werden kann.
Zum Beispiel Es ist möglich, Vorschläge für diese beiden Indizes zu haben:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Tatsächlich könnten Sie die Anforderungen beider erfüllen mit:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Ich habe dies bei viel komplizierteren Indizes (10-20 Schlüsselfelder, 10-20 eingeschlossene Felder) gesehen, bei denen ein Feld zur INCLUDE
macht den zweiten Index überflüssig.
Kommentare
- @MaxVernon: read Treppe zur SQL Server-Indizierung – Teil 1, Einführung in Indizes und dann der Rest der Artikel in der Reihe – behandelt so ziemlich alles über SQL Server-Indizes, vom Intro bis zu fortgeschrittenen Themen
- @MaxVernon: oder siehe Index mit eingeschlossenen Spalten abdecken für eine Diskussion der zu erstellenden eingeschlossenen Spalten e ein Index ", der "
Antwort
Der Grund, warum Sie aufgefordert werden, einen neuen Index zu erstellen, liegt darin, dass der Index, den Sie haben, nicht der bestmögliche ist. Das Abfrageoptimierungsprogramm ist sehr selektiv bei der Auswahl des zu verwendenden Index. Der folgende Link soll Ihnen helfen, die Selektivität zu verstehen:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
Sie haben oben gesagt, dass Sie alle Spalten in den Index aufgenommen haben – im Wesentlichen um die Tabellendaten zu duplizieren. Was würde es auf dieser Basis schaden, drei separate Indizes für die von Ihnen genannten Spalten zu erstellen? Der Platzbedarf wäre geringer und die Geschwindigkeit viel höher. Ich würde eine Vermutung wagen, dass dies der DTA / Ausführungsplan Ihnen sagt – nur auf eine andere Art und Weise.
Sehen Sie sich die Details des Ausführungsplans an, die von der Abfrage generiert werden, um festzustellen, wo sich Ihre Engpässe befinden, und verwenden Sie diese als Richtlinie für die Gestaltung Ihrer Indizes. SQL Server kann ziemlich gut wissen, was am besten ist – vertrauen Sie auf das, was es Ihnen sagt.
Ich hoffe, das hilft Ihnen.
Schreibe einen Kommentar