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.
quelle
Antworten:
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.
quelle
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.
quelle
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 .
quelle
Wenn Sie keine Partitionierung durchführen, weil Sie alte Daten archiviert haben, tun Sie dies aus dem falschen Grund und sollten dies nicht tun.
quelle