Update nach Partitionierung bis zur Produktion:
Die Entscheidung für die richtige Partitionierung für einen Clustered Columnstore Index (CCI) ist ein sehr maßgeschneiderter Prozess. Wenn die falschen Partitionen ausgewählt werden, sind Leistung und Komprimierung schlechter als in einem nicht partitionierten Schema.
Da ich vier CCIs partitioniert habe, habe ich die CCI mit den wenigsten Datensätzen ausgewählt und ihre Datensatzanzahl durch 1.048.576 (die ideale CCI-Zeilengruppengröße) geteilt. Ich habe diesen Quotienten als meine vorgeschlagene Anzahl von Partitionen verwendet. Dann habe ich Abfragen zur Datensatzanzahl basierend auf diesem Schema ausgeführt, um die tatsächlichen Zeilenzahlen pro Partition zurückzugeben. Dieser Schritt sollte sicherstellen, dass die Datensätze einigermaßen gleichmäßig auf die Partitionen verteilt sind. Dort war. Ich Glückspilz.
Ein Hindernis trat auf: Dieser Produktionsanalyseprozess half mir, die richtige Anzahl von Partitionen zu ermitteln, jedoch nur für die Produktion. Meine unteren Umgebungen sind viel kleiner als die Produktion. Die gewählte Partitionierungsstufe hat die Daten so fein geschnitten, dass ich überhaupt keine vollständigen Zeilengruppen hatte. Die unteren Datenbanken wurden größer und die Abfragezeiten blieben gleich. IO ging dramatisch zurück und ich musste wiederholt darauf hinweisen, als die Gewinne dieser Initiative in Frage gestellt wurden. Es war schwer zu beweisen, dass die Partitionierung wirklich helfen würde, bis ich zur Produktion kam.
Das Ergebnis: Die Partitionierung war ein großer Erfolg in der Produktion. IO ist weit unten und meine Abfragezeiten wurden um 70% oder mehr reduziert. Ich habe auch mehr Optionen zum Verwalten dieser Tabellen in kleinen Blöcken.
Einige Hinweise: Wählen Sie das richtige Feld für die Partitionierung aus. Wenn Sie Abfragen haben, die in vielen Partitionen navigieren müssen, kann dies zu einer Leistungsminderung führen. Außerdem habe ich Raum für Wachstum gelassen und meiner Partitionsfunktion Partitionen und Bereiche für Daten hinzugefügt, die jetzt nicht vorhanden sind, aber eines Tages verfügbar sein werden.
Ursprüngliche Antwort nur von lokalen Tests:
Seit ich diese Frage gestellt habe, habe ich mehr Forschung und einen POC vor Ort betrieben. Es wurde vorgeschlagen, diesen POC in einer Antwort zu teilen.
In meinem POC habe ich eine Partitionsfunktion verwendet von:
CREATE PARTITION FUNCTION [MyIntPF](int)
AS RANGE LEFT
FOR VALUES (
N'50'
, N'100'
, N'150'
, N'200'
, N'250'
, N'300'
, N'350'
, N'400'
, N'450'
, N'500'
);
CREATE PARTITION SCHEME [MyIntPS]
AS PARTITION [MyIntPF]
TO (
[MyInt050fg]
, [MyInt100fg]
, [MyInt150fg]
, [MyInt200fg]
, [MyInt250fg]
, [MyInt300fg]
, [MyInt350fg]
, [MyInt400fg]
, [MyInt450fg]
, [MyInt500fg]
, [MyInt000fg]
);
Diese Funktion weist jeder Partition 50 MyInts zu, die Platz für ein wenig Wachstum bieten.
Denken Sie daran, dass ich ungefähr 350 verschiedene MyInts in den 170 Millionen Datensätzen in den PROD-CCIs habe. David Browne schlug eine Mindestdatensatzgröße von 1 MB in einer Partition vor, die sinnvoll ist, um ein CCI-komprimiertes Segment zu optimieren. Ich irre mich aus zwei Gründen. Der erste Grund ist, die Erstellung eines POC-Monsters mit 100 Partitionen zu vermeiden. Das zweite ist, dass ich davon ausgehe, dass 1M für jede Tabelle in der Partition gilt. Ich partitioniere vier Spaltenspeicher, von denen der kleinste 25 Millionen Datensätze hat. Wenn ich es in 100 Teile zerbrechen würde, würde es niemals ein vollständiges Segment erreichen.
In meiner lokalen Entwicklungsdatenbank habe ich 2,2 Millionen Datensätze in der CCI ganz links und noch weniger als in den untergeordneten CCIs. Dies stellt ein Problem für die Erstellung einer realistischen Replikation von PROD dar. Ich sollte wirklich ein wenig zusätzliche Zeit priorisieren, um eine große lokale Datenbank dafür zu erstellen, aber in der Zwischenzeit sind hier die Vorher / Nachher-E / A-Ergebnisse der lokalen Partition. Ich habe nach einem Aggregat von meiner CCI ganz links gefragt, das auf MyInt = einem einzelnen Wert basiert.
Nicht partitioniert
Scananzahl 1, logische Lesevorgänge 0, physische Lesevorgänge 0, Vorlesevorgänge 0, logische Lesevorgänge 1548,
lob physische liest 0, lob liest voraus liest 44.
Segment liest 4, Segment übersprungen 0.
Partitioniert
Scananzahl 1, logische Lesevorgänge 0, physische Lesevorgänge 0, Vorauslesevorgänge 0, logische Lesevorgänge 268,
lob physische liest 0, lob liest voraus liest 0.
Segment liest 1, Segment übersprungen 0.
Wie erwartet konnte SQL Server alle Partitionen bis auf eine in einer Abfrage mit einem MyInt-Gleichheitsprädikat überspringen.
Ich arbeite weiter daran und sollte Zeit haben, mich hier zu aktualisieren, wenn die Dinge voranschreiten.