it-swarm.com.de

Verbessert die Tabellenpartitionierung die Leistung? Lohnt es sich?

Ich war gerade an einem Projekt beteiligt, für das ich einen Datenmigrationsprozess und eine Weboberfläche entwickeln muss, die eine bereits vorhandene SQL Server-Datenbank verwendet. Diese Datenbank wurde vor einigen Jahren von einer anderen Person entwickelt. Sie verfügt über rund 100 GB Daten und nimmt alle 10 Minuten zu (sie speichert 10-Minuten-Daten von mehreren Einheiten -> 144 Datensätze pro Tag und Gerät). Einige Tabellen haben ungefähr 10 Millionen Zeilen. Der Punkt ist, dass ich denke, dass die Haupttabellen so gestaltet wurden, dass sie nicht die effizienteste oder geeignetste Art für die Art von Abfragen sind, die normalerweise ausgeführt werden. Jetzt muss ich beweisen, ob das, was ich sage, besser ist als das, was es bereits implementiert hat. Die DB ist umfangreich in der Anzahl der Tabellen, aber die Struktur kann durch das folgende Diagramm vereinfacht werden: enter image description here

Das Feld Date_Id wird automatisch von einer Funktion generiert, die das Feld DateTime verwendet. In beiden Tabellen gibt es zwei Indizes. Der Clusterindex für jede Tabelle enthält die PK-Felder in derselben Reihenfolge. Der zweite Index für die Unit-Tabelle enthält nur das Feld Unit_Id, während der zweite Index in UnitData die Felder Unit_Id und DateTime in dieser Reihenfolge enthält.

Ich denke jedoch, dass das Design dieses sein sollte: enter image description here

In diesem Fall wird nur ein Clustered-Index für die PK-Felder benötigt. Für dieses DB-Design wäre die übliche Abfrage ungefähr so:

SELECT ud.*
FROM Unit u, UnitData ud
WHERE u.Unit_Id = ud.Unit_Id and ud.DateTime >= 'dd-MM-yyyy'
ORDER BY ud.Unit_Id, ud.DateTime

Jetzt kommt das, was ich wirklich nicht verstehe: Mir wurde gesagt, dass der einzige Grund für eine Date_Id-Spalte darin besteht, sie als Partitionierungsspalte für diese Tabelle zu verwenden. Ich habe nach der tatsächlichen Notwendigkeit einer Partitionierung dieser Tabelle gefragt, und die Antwort lautete: "Abfragen effizienter ausführen, wenn tägliche oder monatliche Daten gewünscht werden". Ich wusste vorher nicht viel über Partitionierung, also habe ich diese Links überprüft:

http://msdn.Microsoft.com/en-us/library/ms190787.aspx

Wie hilft die Tabellenpartitionierung?

Verbessern Sie die Leistung durch Partitionierung

In Anbetracht der Tatsache, dass die ideale Abfrage das Filtern nach Gerät und Datum/Uhrzeit wäre, lauten die Fragen:

  1. Was ist Ihrer Meinung nach die effizienteste und idealste Abfrage für das erste DB-Design (mit Partitionierung)?
  2. Denken Sie wirklich, dass die effizienteste Abfrage für das erste DB-Design besser ist als die zweite (die, die ich oben geschrieben habe)?
  3. Wenn die vorherige positiv war, denken Sie wirklich, dass die Verbesserung genug wert ist, wenn zwei Extras (ID und Datums-ID) und ein zusätzlicher Index vorhanden sind?

Vielen Dank!!

5
Hauri

Die Verwendung der Partitionierung wird Ihre Abfrageleistung nur verbessern, wenn das Partitionierungsschema für Ihre spezifischen Abfragen erstellt wurde.

Sie müssen Ihre Abfragemuster überprüfen und feststellen, wie sie auf die Tabelle zugreifen, um den besten Ansatz zu ermitteln. Der Grund dafür ist, dass Sie nur in einer einzelnen Spalte (dem Partitionierungsschlüssel) partitionieren können. Dies wird für Partitionseliminierung verwendet.

Es gibt zwei Faktoren, die sich darauf auswirken, ob die Partition beseitigt werden kann und wie gut sie funktioniert:

  1. Partitionsschlüssel - Die Partitionierung kann nur für eine einzelne Spalte erfolgen und Ihre Abfrage muss diese Spalte einschließen. Wenn Ihre Tabelle beispielsweise am Datum partitioniert ist und Ihre Abfrage diese Datumsspalte verwendet, sollte die Partitionseliminierung erfolgen. Wenn Sie den Partitionsschlüssel jedoch nicht in das Abfrageprädikat aufnehmen, kann die Engine keine Eliminierung durchführen.
  2. Granularität - Wenn Ihre Partitionen zu groß sind, profitieren Sie nicht von der Eliminierung, da immer noch mehr Daten abgerufen werden, als erforderlich sind. Machen Sie es jedoch zu klein und es wird schwierig zu verwalten.

In vielerlei Hinsicht ähnelt die Partitionierung der Verwendung eines anderen Index mit einigen zusätzlichen Vorteilen. Sie profitieren jedoch nur dann von diesen Vorteilen, wenn Sie es mit unglaublich großen Tischen zu tun haben. Persönlich denke ich nicht einmal über eine Partitionierung nach, bis meine Tabelle über 250 GB groß ist. In den meisten Fällen deckt eine genau definierte Indizierung viele Anwendungsfälle für kleinere Tabellen ab. Basierend auf Ihrer Beschreibung sehen Sie kein großes Datenwachstum. Daher kann es sein, dass eine ordnungsgemäß indizierte Tabelle für Ihre Tabelle einwandfrei funktioniert.

Ich würde Ihnen dringend empfehlen, zu überprüfen, ob eine Partitionierung tatsächlich erforderlich ist, um Ihre Probleme zu lösen. Man würde normalerweise eine sehr große Tabelle partitionieren, um:

  • Verteilen von Daten auf verschiedene Festplattentypen, sodass mehr „aktive“ Daten auf einem schnelleren und teureren Speicher abgelegt werden können, während weniger aktive Daten auf einem billigeren, langsameren Speicher abgelegt werden. Dies ist meist eine Kosteneinsparungsmaßnahme.
  • Unterstützung bei der Indexpflege für extrem große Tabellen. Da Sie Partitionen einzeln neu erstellen können, kann dies dazu beitragen, dass die Indizes bei minimaler Auswirkung ordnungsgemäß verwaltet werden.
  • Nutzung der Partitionierung für einen verbesserten Archivierungsprozess. Siehe Schiebefenster .
10
Mike Fal

Die Tabellenpartitionierung kann die Leistung verbessern, wenn Sie in der Lage sind, innerhalb der Grenzen der Funktionsweise der Partition zu arbeiten. Siehe die Beschreibung unter:

http://technet.Microsoft.com/en-us/library/ms177411 (v = sql.105) .aspx

Durch die Partitionierung kann Ihr Server jedoch auch langsamer ausgeführt werden, wenn Ihre Partitionen nicht "nur so" eingerichtet sind und Ihre Abfragen nicht in einer einzelnen Partition verbleiben können. Gail Shaw hat einen Artikel dazu geschrieben:

https://www.simple-talk.com/sql/database-administration/gail-shaws-sql-server-howlers/

Ein paar Zitate: "Partitionierung kann die Abfrageleistung verbessern, es gibt jedoch keine Garantie." "Zusammenfassend lässt sich sagen, dass die Partitionierung hauptsächlich der Verbesserung der Wartung, des schnellen Ladens, des schnellen Löschens und der Möglichkeit dient, eine Tabelle auf mehrere Dateigruppen zu verteilen. Sie dient nicht in erster Linie der Abfrageleistung."

2
RLF

Lesen Sie dies auf der Partitionierung - SQL Server-Table-Partitionen auf SSD . Bis zu # 2 wird Ihre Tabelle fragmentiert, wenn Sie sie auf diese Weise entwerfen. Sie sollten die Positionen der Spalten wechseln. Machen Sie DateTime zur ersten Spalte. Auf diese Weise werden die neuen Zeilen unten hinzugefügt, anstatt jeden Tag Platz für jede Unit_Id zu finden - viele Seitenaufteilungen. Anschließend können Sie einen nicht verknüpften Index für Ihre Abfrage erstellen.

0
DenisT