SQL Server-Partitionierung - Was wird für den Partitionsschlüssel verwendet?

10

Ich habe noch nie mit SQL Server-Partitionierung gearbeitet, aber ich stand derzeit vor dem Entwurf einer Datenbank, für die die Volumes dies wahrscheinlich rechtfertigen. Das System ist für Gutscheine. Die Gutscheine sind in der Regel alle sechs Wochen auszustellen, es erfolgt jedoch auch eine Ad-hoc-Ausstellung - z. B. für einen besonderen Anlass. Es gibt 15 Millionen Kunden und für jedes Ausstellungsereignis erhält jeder Kunde 6 verschiedene Coupontypen, was insgesamt 90 Millionen Couponinstanzen ergibt. Wir müssen die Einlösungsdaten der Couponinstanz verfolgen und diese 6 Monate lang aufbewahren, obwohl ein Coupon normalerweise nur sechs Wochen gültig ist. Einlösungsanfragen für einen ungültigen Gutschein gelangen nicht in die Datenbank, da diese vom POS bis validiert werden.

Über einen Zeitraum von sechs Monaten müssen bis zu 360 Millionen Zeilen in der Coupon Instance-Tabelle und bis zu 72 Millionen (unter der Annahme einer Rückzahlungsrate von maximal 20%) in der Einlösungstabelle gespeichert werden. Ich habe das Gefühl, dass diese Zahlen für eine einzelne Partition zu groß sind.

Meine Frage ist - was als Partitionsschlüssel zu verwenden? Ein offensichtlicher Kandidat wäre ein Ausstellungsereignis, das ungefähr 6 Partitionen ergibt. Aber dann denke ich, dass vielleicht sogar das eine Partitionsgröße ergeben würde, die zu groß ist, um eine optimale Leistung zu ermöglichen? Wäre es möglich, durch zwei Schlüssel zu partitionieren, z. B. durch das Ausgabeereignis + die letzte Ziffer der Kunden-ID? Die Logik wäre also:

If issuance event = 1 and last digit of customer id < 5 then
    Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
    Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
    Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
    Store in partition 4
Etc...

Ich bin mir auch nicht sicher, welche Spezifikation des Datenbankservers wir benötigen werden. Reichen 16 GB und 8 CPUs aus? Die Datenbank muss in der Lage sein, ein Ergebnis aus der Coupon-Instanztabelle zurückzugeben, das in weniger als einer halben Sekunde auf einem numerischen Barcode-Wert eingegeben wurde. Die erwartete Transaktionsanforderung zum Validieren (Auswählen) und Einlösen (Einfügen) wird voraussichtlich einen Spitzenwert von ungefähr 3.500 pro Minute erreichen.

Der 64-Bit-Datenbankserver SQL Server 2008r2 wird als VM von einem sehr leistungsstarken Host mit Zugriff auf ein SAN mit hoher Leistung und großer Kapazität bereitgestellt.

Ich wäre sehr dankbar für Ratschläge von Personen, die eine SQL Server-Lösung zur Verwaltung ähnlicher Volumes bereitgestellt haben.

Grüße

Rauben.

Rob Bowman
quelle
2
Ihre Tabellen sind immer noch klein - keine Notwendigkeit für Partitionen, ich habe eine Tabelle mit ein paar Milliarden Zeilen ohne Partition, funktioniert. Partitionen sind jedoch gut für FAST DROP.
TomTom
1
Unsinn @TomTom, Partitionen können bei Zeilenzählungen von Vorteil sein, ein Bruchteil davon. Zugegeben, das Partitionsschema muss für die Zugriffsmuster von Vorteil sein, um einen Leistungsgewinn zu erzielen, aber ein pauschales "no NEED" bei dieser Größe ist eindeutig falsch.
Mark Storey-Smith
1
Nein, es ist richtig. NOTWENDIG! = Nutzen. NEED ist, wenn Sie Probleme beim Ausführen von Abfragen ohne Partitionen haben.
TomTom
1
Hey @TomTom Ich denke, dass du einen kleinen Pausenpartner brauchst, der ein bisschen stark ist, auch wenn er nicht wirklich anstößig ist. Ich stimme Mark StoreySmith zu, eine Decke "no NEED" ist einfach falsch, aber Ihre Behauptung, dass sie wahrscheinlich nicht benötigt wird, ist richtig. Ich stelle mir vor, es geht um die Indizierung. Ich weiß auch, dass Mark weiß, was Sie unter Bedürfnis und Nutzen verstehen. Schneiden Sie uns alle ein wenig locker und lassen Sie das Koffein los, k? (Und glauben Sie mir, ich bin dafür bekannt, dass ich an manchen Tagen sehr wenig Geduld habe, besonders an Tagen wie heute, an denen ich Schmerzmittel für meinen Rücken
bekomme.

Antworten:

14

Die Fragen zu den Serverspezifikationen sollten entweder an Serverfault oder DBA.SE gerichtet werden.

Für die Partitionierungsfrage denke ich nicht, dass Sie dafür unbedingt partitionieren müssen.

360 m Reihen sind viel, aber nicht zu unhandlich.

Sie NICHT unter keinen Umständen versuchen, Partition auf der Grundlage der letzten Stelle eines Feldes. Ich bin mir nicht sicher, ob dies überhaupt funktionieren würde, aber es ist nicht SARGable, was nicht haltbar wäre.

Wenn Sie nur eine einzelne Zeilensuche basierend auf einem numerischen Schlüssel durchführen müssen, hilft die Partitionierung wahrscheinlich nicht.

Wenn Sie sich für die Partitionsroute entscheiden, müssen Sie berücksichtigen, dass alle Ihre Abfragen Ihre Partitionsschlüssel enthalten müssen, damit die Engine weiß, welche Partition überprüft werden muss. Andernfalls werden alle überprüft, und Sie beeinträchtigen die Leistung.

JNK
quelle
Ich stimme auch zu. Manchmal braucht man einfach bessere Indizes.
Jcolebrand
Ich bin nicht einverstanden @JNK. Eine einzelne Zeilensuche basierend auf einem numerischen Schlüssel, der von der Partitionseliminierung profitiert, reduziert die E / A. Wenn Zugriffsmuster so sind, dass Partitionen, auf die häufig zugegriffen wird, über Partitionen mit seltenem Zugriff im Pufferpool verbleiben, haben Sie weitere Leistungsvorteile. Und wir haben noch nicht einmal meine Lieblingsfunktion angesprochen, die Ihnen durch Partitionierung eine teilweise Verfügbarkeit bietet.
Mark Storey-Smith
Für die Aufzeichnung, in Ihren anderen Punkten stimme ich voll und ganz zu :)
Mark Storey-Smith
@ MarkStorey-Smith - Es wird von seinem Schlüssel abhängen. Wie derzeit im OP definiert, würde die Partition keinen Wert hinzufügen. Es hört sich auch so an, als ob er keinen zweiteiligen Schlüssel mit einem Datumsfeld oder einem "normalen" Partitionsschema verwenden kann.
JNK
5

Sie können auf mehreren Schlüsseln partitionieren, wenn Sie eine persistierte berechnete Spalte verwenden. Wie andere bereits gesagt haben, funktioniert die Partitionierung jedoch nicht in jeder Situation. Ich bin mir nicht sicher, ob ich Ihr Szenario genug verstehe, um Ihnen konkrete Ratschläge zu geben, aber hier sind einige allgemeine Richtlinien:

  • Die Partitionierung ist beim Lesen von Daten hilfreich, wenn der Partitionierungsschlüssel Teil der SQL-Anweisung ist, wodurch der Optimierer das Ausschließen von Paritionen aufrufen kann. Sie müssen sicherstellen, dass der von Ihnen ausgewählte Schlüssel für die meisten Abfragen nützlich ist.

  • Ein Vorteil einer guten Partitionierungsstrategie besteht darin, Daten zu altern. Wenn Ihr Partitionsschlüssel beispielsweise datumsbasiert ist (dh der Tag des Jahres) und Sie alle Daten entfernen möchten, die älter als ein bestimmtes Datum sind, können Sie diese Paritionen sehr einfach in eine leere Tabelle umschalten und abschneiden.

Stuart Ainsworth
quelle
4

Sie müssen Ihre Anforderungen wirklich etwas klarer definieren. Sie erwähnen, dass Sie in 6 Monaten ca. 360 Millionen Zeilen haben werden. Wie wäre es in 2 Jahren? Wachsen Sie immer noch nur mit der Geschwindigkeit, mit der Sie gerade wachsen? Oder besteht die Möglichkeit, dass Sie ein exponentielles Wachstum erleben. Möchten Sie die Daten für immer in dieser Tabelle behalten? oder möchten Sie Daten regelmäßig archivieren?

Die Partitionierung kann zur Datenarchivierung verwendet werden. Siehe Schiebefensterszenario. Siehe dieses Whitepaper und dieses .

Die Partitionierung kann auch zum Verwalten der Indexfragmentierung verwendet werden. Sie können bestimmte Partitionen neu erstellen / organisieren.

Sie sollten auch partitionierte Ansichten im Gegensatz zu partitionierten Tabellen berücksichtigen. Für partitionierte Ansichten ist keine SQL Server Enterprise-Lizenz erforderlich. Mit partitionierten Ansichten können Sie auch Online-Indexwiederherstellungen für eine bestimmte "Partition" durchführen.

Partitionierung kann auch bei der Planung Ihrer Notfallwiederherstellung berücksichtigt werden. Es kann für die teilweise Wiederherstellung der Datenbank verwendet werden. Zum Beispiel: Sie können Ihre alten Partitionen auf einer anderen Dateigruppe als die Haupt- / aktuellen Partitionen haben. Wenn Sie dann wiederherstellen, stellen Sie die primäre Dateigruppe wieder her, dann die Dateigruppe, auf der sich Ihre aktuellen Partitionen befinden, und zuletzt können Sie die Dateigruppen wiederherstellen, auf denen sich die alten Partitionen befinden. Dies kann die Zeit reduzieren, die Ihre Anwendung nicht benötigt.

Schauen Sie sich dieses großartige Video von Kimberly Tripp über die Partitionierung an .

Dharmendar Kumar 'DK'
quelle
Wir müssen die Daten nur sechs Monate lang aufbewahren. Jede Woche führten wir einen Reinigungsjob durch, bei dem alle Gutscheine gelöscht wurden, die mehr als sechs Monate zuvor ausgestellt worden waren.
Rob Bowman
3
Grundsätzlich müssten Sie also jede Woche ca. 15 Millionen Zeilen löschen / entfernen. Wie breit ist der Tisch? Ich würde vorschlagen, dass Sie die Tabelle nach Datumsspalte partitionieren. Auf diese Weise wäre das wöchentliche Löschen eine einfache Metaoperation. Sie müssen lediglich die älteste Partition aus der partitionierten Haupttabelle in eine Staging-Tabelle umschalten. Lassen Sie dann die Staging-Tabelle fallen. Dies wird als Sliding Windows-Szenario bezeichnet. Schauen Sie sich das erste Whitepaper an, das ich veröffentlicht habe.
Dharmendar Kumar 'DK'
-2

Wenn Sie keine Partitionierung durchführen, weil Sie alte Daten archiviert haben, tun Sie dies aus dem falschen Grund und sollten dies nicht tun.

Ryk
quelle
2
Neben der Archivierung gibt es viele Gründe, die Partitionierung zu verwenden. Das Ausschließen von Partitionen ist bei korrekter Verwendung für viele verschiedene Arten von Abfragen von großem Vorteil.
Stuart Ainsworth
Ich stimme Stuart zu, das ist ein etwas schlechter Rat.
Jcolebrand