Leistungsoptimierung für große Tabellen (SQL Server 2008 R2)

14

Hintergrund:
Ich habe eine Faktentabelle in der UAT-Phase. Ziel ist es, 5 Jahre Daten in Prod zu laden (erwartete Größe 400 Mn Datensätze). Derzeit sind nur 2 Jahre Daten in Test.

Tabelleneigenschaften:

  1. Anzahl der Abmessungen ~ 45
  2. Maßnahmen ~ 30
  3. Nicht additive Maßnahmen und andere Spalten ~ 25
  4. Aktuelle Datengröße ~ 200 Millionen (2-Jahres-Daten)
  5. Zeitansicht: 3 verschiedene Monatsansichten: Fiscal / Calendar / Adjusted (dh dieselbe Zeile kann in verschiedenen Monaten liegen, je nachdem, nach welcher Ansicht man sucht)
  6. Ein Benutzer benötigt jeweils nur eine Ansicht. (dh es wird nur eine Monatsspalte in der Abfrage verwendet, was uns daran hindert, die Partitionierung in der Zeitansicht durchzuführen.)
  7. Indizes: 1 Clustered-Index für die Natural-Schlüssel (8 Spalten) .Erstellte 3 nicht-Clustered-Indizes für jede Monatsspalte, einschließlich weniger Dimension-SKs (FKs) und aller Kennzahlen.
  8. Aus diesem Grund sind die Indizes riesig (insgesamt 190 GB).
  9. Speicherplatz ist keine Einschränkung (1 TB zugewiesen)
  10. 64 GB RAM im Server verfügbar.
  11. Tabellenkomprimierung ebenfalls durchgeführt.

Anforderung:
Abfragen in dieser Faktentabelle sollten innerhalb von 30 Sekunden zu einem Ergebnis führen (bei allgemeinen Abfragen wird die Summe (Kennzahl) ausgewählt, bei der die Anzahl der Dims nach Dim-Werten gruppiert wird). Berichte werden direkt über dieser Faktentabelle erstellt.

Problem:
Jede Abfrage, die im Index verfügbare Spalten enthält, funktioniert einwandfrei. Wenn wir jedoch andere Spalten einbeziehen, die nicht im Include enthalten sind, ist dies ein Fehler. Es dauert mehr als 5-10 Minuten. Kann jemand eine Lösung vorschlagen, die für jede ausgewählte Dimension / Spalte geeignet ist? Kann die Indexansicht in dieser Situation helfen?

user1801862
quelle

Antworten:

6

Aktualisieren Sie auf SQL Server 2012 und verwenden Sie Spaltenspeicher . Sie leben von diesen Anforderungen. Im Ernst, laden Sie die Evaluierungsversion herunter und probieren Sie sie aus. Löschen Sie alle Indizes, löschen Sie den Clustered-Index, fügen Sie einfach einen Nicht-Clustered-Columnstore-Index für alle Spalten hinzu und geben Sie ihm einen Whirl. Ich habe Fälle wie Ihren gesehen, die die Ausführungszeit auf 2-3 Sekunden verkürzt haben, hauptsächlich, weil die Segmenteliminierung eingesetzt hat . Einige ergänzende Informationen:

Remus Rusanu
quelle
0

Wird eine indizierte Ansicht Ihr Problem lösen? Wie aktuell müssen die Daten sein? Sie können eine indizierte Ansicht für einige Permutationen erstellen. Aber mit so vielen Dimensionen und Maßen könnte Ihnen schnell der Raum ausgehen!

Wie wäre es mit SSDs?

Nick.McDermaid
quelle
Die Daten werden jeden Monat aktualisiert. Wie lange dauert die Aktualisierung der Ansicht?
Wenn Ihre vorhandene Abfrage 5-10 Minuten dauert, dauert die indizierte Ansicht 5-10 Minuten. Wenn der Vorgang abgeschlossen ist und Sie dieselbe Abfrage ausführen, wird sie zurückgegeben, als ob sie aus einer Tabelle stammt (dh sofort). In einer indizierten Ansicht wird ein bestimmtes Stück SQL vorab ausgeführt. Wenn Sie SQL übermitteln, das mit ihm übereinstimmt, wird es aus der indizierten Ansicht übernommen, anstatt es erneut auszuführen. Der Hauptvorteil einer indizierten Ansicht besteht darin, dass Sie Ihre vorhandenen Abfragen nicht ändern müssen. Sie werden automatisch verwendet. Der Nachteil ist, dass Sie so ziemlich eine für ein paar verschiedene Kombinationen erstellen müssen.
Nick.McDermaid
Es wird jedoch nicht empfohlen, mehrere indizierte Ansichten zu erstellen, um die Arbeit zu beschleunigen. Es wird Ihnen schließlich die Zeit und der Speicherplatz ausgehen. Es könnte nur eine Sache sein, in Ihr Arsenal zu stecken.
Nick.McDermaid
und bitte ... schau mal in die columnstores wie vorgeschlagen!
Nick.McDermaid