Gründe dafür, keinen Clustered-Index in SQL Server 2005 zu haben

8

Ich habe einige Datenbankerstellungsskripts für eine SQL SERVER 2005-Datenbank geerbt.

Eine Sache, die ich bemerkt habe, ist, dass alle Primärschlüssel als NON CLUSTERED indexes im Gegensatz zu clustered erstellt werden.

Ich weiß, dass Sie nur einen Clustered-Index pro Tabelle haben können und dass Sie ihn in einer Nicht-Primärschlüsselspalte für die Abfrageleistung von Suchen usw. haben möchten. Allerdings gibt es keine weiteren CLUSTERED -Indizes für die Tabellen in Fragen .

Meine Frage ist also, ob es irgendwelche technischen Gründe gibt, Clusterindizes für eine Primärschlüsselspalte außer den oben genannten zu haben.

    
AJM 27.10.2010, 14:00
quelle

5 Antworten

8

Auf irgendwelchen "normalen" Daten oder Nachschlagetabellen: Nein, ich sehe überhaupt keinen Grund.

Auf Sachen wie Massenimporttabellen oder temporäre Tabellen - es kommt darauf an.

Für manche Leute scheint es überraschend, dass ein guter Clustered-Index Operationen wie INSERT oder UPDATE beschleunigen kann. Siehe Kimberly Tripps ausgezeichnet Die Debatte über den Clustered Index geht weiter .... Blog Beitrag, in dem sie sehr detailliert erklärt, warum dies der Fall ist.

In diesem Licht: Ich sehe keinen irgendeinen gültigen Grund nicht für einen guten Clustered-Index (eng, stabil, einzigartig, ständig steigend = INT IDENTITY als die offensichtlichste Wahl) für jede SQL Server-Tabelle.

Um zu erfahren, wie und warum Clustering-Schlüssel zu wählen sind, lesen Sie alle hervorragenden Blog-Beiträge von Kimberly Tripp zum Thema:

Ссылка

Ссылка

Ausgezeichnete Sachen von der "Queen of Indexing"! :-)

    
marc_s 27.10.2010 14:03
quelle
6

Clustered-Tabellen und Heap-Tabellen

(Guter Artikel zum Thema auf www.mssqltips.com )

HEAP-Tabelle (ohne gruppierten Index)

  • Daten werden nicht in einem bestimmten gespeichert Bestellung

  • Bestimmte Daten können nicht abgerufen werden schnell, es sei denn, es gibt auch Nicht gruppierte Indizes

  • Datenseiten sind nicht miteinander verknüpft Der sequentielle Zugriff muss zurückverfolgt werden zur Indexzuordnungskarte (IAM) Seiten

  • Da es keinen gruppierten Index gibt, zusätzliche Zeit wird nicht benötigt Pflegen Sie den Index

  • Da es keinen gruppierten Index gibt, Es besteht nicht die Notwendigkeit für zusätzliche Speicherplatz zum Speichern des Clustered-Index Baum

  • Diese Tabellen haben einen index_id-Wert von 0 in der Katalogsicht sys.indexes

Clustered-Tabelle

  • Die Daten werden in der Reihenfolge gespeichert, die auf den Clustered-Index-Schlüssel

  • Daten können schnell abgerufen werden auf dem Clustered-Index-Schlüssel, wenn die Abfrage verwendet die indizierten Spalten

  • Datenseiten sind schneller verknüpft Sequentieller Zugriff    Es wird zusätzliche Zeit benötigt, um den Clustered-Index basierend auf zu erhalten INSERTS, UPDATES und DELETES

  • Zum Speichern wird zusätzlicher Speicherplatz benötigt Clustered-Index-Baum    Diese Tabellen haben den Wert index_id von 1 im Katalog sys.indexes Ansicht

Branimir 27.10.2010 14:10
quelle
1

Bitte lesen Sie meine Antwort unter " Kein direkter Zugriff auf die Datenzeile in der gruppierten Tabelle - warum?" , zuerst. Speziell Punkt [2] Vorbehalt.

Die Leute, die die "Datenbank" erstellt haben, sind Kretinen. Sie hatten:

  • eine Reihe von nicht normalisierten Spread-Sätzen, keine normalisierten relationalen Tabellen
  • die PKs sind alle IDENTITY-Spalten (die Tabellen sind miteinander verknüpft; sie müssen einzeln nacheinander durchsucht werden); Es gibt keinen relationalen Zugriff oder relationale Macht über die Datenbank
  • sie hatten PRIMARY KEY, die UNIQUE CLUSTERED
  • produzieren
  • sie haben festgestellt, dass dies die Parallelität verhindert hat
  • Sie haben das CI entfernt und alle zu NCIs gemacht
  • sie waren zu faul, um die Umkehrung zu beenden; um einen alternativen (aktuellen NCI) zu nominieren, der zum neuen CI wird, für jede Tabelle
  • die IDENTITY-Spalte bleibt der Primärschlüssel (das ist es nicht wirklich, aber es ist in dieser hamfisted-Implementierung)

Für solche Sammlungen von Tabellen, die als Datenbanken maskiert sind, wird es immer häufiger, CIs ganz zu vermeiden und nur NCIs plus den Heap zu haben. Offensichtlich bekommen sie nichts von der Macht oder den Vorteilen des CI, aber zur Hölle, sie bekommen keine Kraft oder Nutzen von relationalen Datenbanken, also wen interessiert es, dass sie nicht die Macht von CIs bekommen, die für relationale Datenbanken entwickelt wurden ist nicht). So wie sie es sehen, müssen sie sowieso das verflixte Ding "umgestalten", also warum sollten sie sich kümmern. Relationale Datenbanken benötigen kein "Refactoring".

Wenn Sie diese Antwort weiter diskutieren müssen, senden Sie bitte die CREATE TABLE / INDEX DDL; ansonsten ist es ein zeitverschwendendes akademisches Argument.

    
PerformanceDBA 29.10.2010 13:39
quelle
0

Hier ist ein weiterer (noch in anderen Antworten vorhandener) möglicher Grund (noch zu verstehen):

Ich hoffe, ich werde später aktualisieren, aber jetzt ist es eher der Wunsch, diese Themen zu verlinken

Update:
Was vermisse ich im Verständnis der gruppierte Index?

    
quelle
0

Bei einigen heute noch verwendeten b-tree Servern / Programmiersprachen werden flache ascii Dateien mit fester oder variabler Länge zum Speichern von Daten verwendet. Wenn ein neuer Datensatz / Zeile zu einer Datei (Tabelle) hinzugefügt wird, wird der Datensatz (1) an das Ende der Datei angefügt (oder ersetzt einen gelöschten Datensatz) und (2) die Indizes werden ausgeglichen. Wenn Daten auf diese Weise gespeichert werden, müssen Sie sich nicht um die Systemleistung kümmern (soweit der b-tree-Server einen Zeiger auf den ersten Datensatz zurückgibt). Die Antwortzeit wird nur von der Anzahl der Knoten in Ihren Indexdateien beeinflusst.

Wenn Sie sich mit SQL beschäftigen, werden Sie hoffentlich feststellen, dass die Systemleistung beim Schreiben einer SQL-Anweisung berücksichtigt werden muss. Die Verwendung einer "ORDER BY" -Anweisung für eine nicht indizierte Spalte kann ein System in die Knie zwingen. Die Verwendung eines Clustered-Indexes könnte die CPU unnötig belasten. Es ist das 21. Jahrhundert und ich wünschte, wir müssten nicht über die Systemleistung beim Programmieren in SQL nachdenken, aber wir tun es immer noch.

Bei einigen älteren Programmiersprachen war es obligatorisch, einen Index zu verwenden, wenn sortierte Daten abgerufen wurden. Ich wünschte nur, dass diese Anforderung noch heute besteht. Ich kann mich nur wundern, wie viele Unternehmen ihre langsamen Computersysteme wegen einer schlecht geschriebenen SQL-Anweisung auf nicht-indizierten Daten aktualisiert haben.

In meinen 25 Jahren Programmierung habe ich meine physikalischen Daten nie in einer bestimmten Reihenfolge gespeichert. Vielleicht vermeiden deshalb einige Programmierer die Verwendung von Clustered-Indizes. Es ist schwer zu wissen, was der Kompromiss ist (Speicherzeit, Verse-Retrieval-Zeit), besonders wenn das System, das du entwirfst, irgendwann Millionen von Datensätzen speichern könnte.

    
mjb 09.06.2016 00:11
quelle