Ich habe eine große Datenbank (200 GB +), die einige Protokollinformationen enthält. Und ich möchte SELECT
Abfragen und gespeicherte Prozeduren beschleunigen . Ich habe eine Tabelle mit einer GeneratedOnUtc
Datums- / Uhrzeitspalte und einen nicht gruppierten Index.
Ich denke daran, es in einen Clustered-Index zu ändern.
Gründe für:
Große Datenmenge (~ 40 Millionen Zeilen)
Spalte in mehreren verwendet
Where
Klauseln (between
,>
,<
)Die Spalte wird in
ROW_NUMBER() OVER (ORDER BY d.GeneratedOnUtc asc) AS Row
Abfragen verwendet
Grund gegen:
- Eine große Anzahl von Einsätzen (~ 60.000 pro Tag) kann zu häufigen Umbauten von B-Bäumen führen.
sql-server
performance
index
clustered-index
Alex Zhukovskiy
quelle
quelle
GeneratedOnUtc
Feld enthalten würden?SELECT
Abfragen und gespeicherte Prozeduren zu beschleunigen, würde ich mich an die Antwort von @ MaxVernon halten. Wenn die 60.000 Einfügungen pro Tag über mehrere Stunden verteilt sind, sollte die Spitze der Einfügungen / Sek. Keine Sorge sein, aber hier habe ich keine Daten. Das Partitionieren der Tabelle könnte ebenfalls von Interesse sein.Antworten:
Das Ändern Ihrer Tabelle von einem Heap zu einem Clustered-Index sollte Ihre Leistung bei beiden Abfragen und möglicherweise sogar bei Einfügungen erheblich verbessern. Im Allgemeinen sollte Ihr Clustered-Index eng, eindeutig und ständig steigend sein. Die Verwendung einer Datums- / Uhrzeitangabe, deren Eindeutigkeit nicht garantiert werden kann, ist nicht ideal, da sie 8 Byte beträgt. Da sie nicht eindeutig ist, fügt SQL nicht eindeutigen Zeilen einen Vier-Byte-Eindeutiger hinzu. Möglicherweise ist es besser, eine Identitätsspalte mit einem int als Clustered-Index zu verwenden, und da dies genau das ist, wonach die "row_number" -Abfragen ohnehin wirklich suchen (eine immer größer werdende eindeutige Zahl), ist dies möglicherweise ein guter Weg, insbesondere wenn Sie einen haben Anzahl der nicht gruppierten Indizes bereits (da der gruppierte Index vom nicht gruppierten als Zeilenzeiger verwendet wird, um ihnen Größe zu verleihen).
Ich schlage vor, Sie erstellen eine Testkopie Ihrer Datenbank und testen sie dann mit einem Clustered-Index für Ihren Datetime-Wert. Vergleichen Sie dies mit einem Test, der einen Clustered-Index für eine neue Identitätsspalte (und einen Nonclustered-Index für Ihre Datetime) verwendet. Sehen Sie, welches mit Ihrer Abfrageladung besser abschneidet. Beide Szenarien übertreffen einen Haufen.
quelle