Eine Datenbank oder eine Teilmenge einer Datenbank kann auf mehrere Server aufgeteilt werden; jede Aufteilung wird als Partition bezeichnet. Stratus und Teradata entwickelten die ersten Massively Parallel Processing (MPP)-Datenbanken mit eigener Spezialhardware. Oracle schuf die erste portable MPP (Massively Parallel Processing) Datenbank , die auf der Hardware verschiedener Anbieter lief. Oracle, Mainframe DB2 und Snowflake verwenden eine Shared-Everything-Architektur, bei der jede Datenbankinstanz die gesamte partitionierte Datenbank und den dynamischen Besitz von Datenblöcken sehen kann, die ein komplexer verteilter Sperrmanager verwalten muss.
Andere Anbieter verwenden einen einfacheren Ansatz für föderierte Datenbanken, bei dem jede Datenbankinstanz nur ihre Partition sieht. Sie können die Partitionierung auf einem einzelnen Knoten verwenden, wenn Sie IO-gebundene Abfragen haben. In diesem Fall können Sie Ihre Daten explizit auf verschiedene IO-Kanäle und Speichergeräte aufteilen.
Wenn Sie beispielsweise einen leistungsstarken Server haben, der eine vollständige Überprüfung einer sehr großen Tabelle durchführen muss, können Sie den Server auf mehrere physische Festplatten partitionieren, um die physischen Beschränkungen eines einzelnen Geräts zu überwinden, wie z. B. die Busbandbreite und die langsamen anfänglichen Suchzeiten aufgrund der Rotationsverzögerung der physischen Festplatten. Die Partitionierung skaliert die IO, um die CPU und die Gesamtsuchzeiten zu optimieren.
Vorteile der Datenpartitionierung
Die häufigsten Gründe, warum Unternehmen eine physische Datenbank partitionieren, sind die Verbesserung der Leistung, der Verfügbarkeit und des Lastenausgleich. Die Leistung wird verbessert, indem Abfragen parallel auf mehr Prozessoren als auf einem einzelnen Server ausgeführt werden. Die Verfügbarkeit wird verbessert, indem die Auswirkungen eines Serverausfalls auf die Partition der von ihm verwalteten Daten begrenzt werden. Parallele Datenbankserver erstellen Anfrage , die die Arbeitslasten auf vernetzte Serverknoten verteilen, um die Verarbeitung zu verteilen und Ergebnisse schneller zu liefern.
Wenn Sie zum Beispiel eine globale Preisanwendung haben, die sehr schnell reagieren muss, könnten Sie die Daten auf drei geografische Rechenzentren verteilen. Da eine geografisch lokale Datenbank über die regionale Preisgestaltung verfügt, ist sie reaktionsschneller als eine einzige globale Datenbank, und die Verfügbarkeit wird verbessert, da die Durchführung von Wartungsarbeiten außerhalb der Spitzenzeiten auf dem Server in den USA keine Auswirkungen auf die Verfügbarkeit der Server in EMEA und Asien hat.
Wenn Anwendungen aus einem einzelnen Server herauswachsen, müssen Sie keinen größeren Server bereitstellen, um Schritt zu halten. Wenn Ihr Datenbanksystem auf einem Clustersystem läuft, kann das Hinzufügen eines zusätzlichen kleineren Knotens kostengünstiger sein. In der Cloud können Sie Server und Speicherplatz On Demand bereitstellen, um Lastspitzen zu bewältigen.
StrategieDatenmanagement
Rechenzentren vor Ort müssen Server bereitstellen, die physischen Beschränkungen unterliegen, wie etwa der Größe des Rechenzentrums. Öffentliche Cloud von Amazon, Microsoft und Google bieten mehr Kapazität als ein in-house Rechenzentrum. Die Actian Data Platform läuft auf öffentlichen Cloud ; der Speicher ist von den Rechenressourcen entkoppelt, so dass die Rechenleistung On Demand wachsen und schrumpfen kann, unabhängig von physischen Partitionen.
Wann eine Tabelle partitioniert werden sollte
Die Partitionierung verkompliziert die Datenbankverwaltung, daher sollten Sie sie nur verwenden, wenn Sie ohne Partitionierung eine angemessene Leistung erzielen können. Verwenden Sie die Partitionierung, wenn Sie die Leistung der Datenbank skalieren müssen, um große Transaktionsvolumen und sehr große Abfragen zu unterstützen.
Strategien für die Aufteilung
Je nach den Anforderungen der Anwendung und dem Inhalt der Daten können Sie die Daten auf verschiedene Weise partitionieren. Wenn die Leistung das Hauptziel ist, sollten Sie die Last gleichmäßig verteilen, um den größten Durchsatz zu erzielen. Sie können zum Beispiel 64 Partitionen pro Server einrichten und einen berechneten Hash verwenden, um die Daten gleichmäßig zu verteilen, oder die Daten mit einem Round-Robin-Schema verteilen. Wenn die Daten einen natürlich zufälligen Schlüsselwert mit hoher Kardinalität haben, können sie in Wertebereiche pro Partition eingeteilt werden. Normalerweise werden die Daten horizontal partitioniert, um die Workload auf viele Server zu verteilen. Im Falle einer vertikalen Partitionierung können Sie beschließen, Ihre Daten in drei globale Regionen aufzuteilen, so dass Sie eine übergeordnete Tabelle mit globalen Werten haben. Detaillierte Tabellen darunter für eine geografische Region können die regionale Autonomie unterstützen.
Partitionierungsmethoden
Datenbanken, die Cluster oder MPP-Konfigurationen unterstützen, bieten mehrere Partitionierungsmethoden. Im Folgenden finden Sie eine Auswahl an Partitionsmethoden:
- Bereichspartitionierung - unterteilt Zeilen auf der Grundlage eines Schlüsselwertbereichs. Wenn Ihre Anwendung Verkaufsanalysen nach Regionen durchführt, kann eine Unterteilung der Daten nach Postleitzahlenbereichen sinnvoll sein.
- Listenaufteilung - organisiert Daten auf der Grundlage einer Liste von Werten. Zum Beispiel könnten die Werte in der Liste mit "Schottland", "England", "Nordirland" und "Wales" in eine Partition mit dem Namen "Vereinigtes Königreich" aufgenommen werden.
- Spaltenpartitionierung - wird verwendet, um eine breite Tabelle in Spalten aufzuteilen, wobei statische Spalten in einer Tabelle gespeichert werden und die dynamischeren Spalten in einer anderen Tabelle und auf einem anderen Server platziert werden, wobei eine Ansicht verwendet wird, um sie als ein einziges Objekt zu verbinden. Eine spaltenorientierte Datenbank kann als vertikal partitioniert betrachtet werden, da jede Spalte eine Tabelle ist.
- Round Robin Partitioning - fügt neue Zeilen in eine andere Partition in einer bestimmten seriellen, sich wiederholenden Reihenfolge ein.
- Hash Partitioning - erzeugt eine zufällige ganzzahlige Partitions-ID auf der Grundlage eines berechneten Wertes, der einen Schlüssel auf der Grundlage des eingefügten Wertes verwenden kann.
- Key Partitioning - ähnelt dem Hash Partitioning, mit dem Unterschied, dass es mehrere Spaltenwerte auswerten kann, um die Zielpartition zu bestimmen.
- Zusammengesetzte Partitionierung - verschachtelt mehrere Ebenen der Partitionierung. Die erste Partitionierungsebene könnte beispielsweise bereichsbasiert sein, und die zweite Ebene könnte innerhalb dieses Bereichs ein Rundlaufverfahren sein.
Aufteilung Beschneidung
Partitionsbeschneidung bezieht sich auf eine Optimierung, die es einer Anfrage ermöglicht, die Auswertung von Partitionen für eine bestimmte Anfrage zu umgehen, um die Leistung zu verbessern. Wenn Sie z. B. nur einen bestimmten Postleitzahlenbereich Anfrage möchten, können Sie eine WHERE-Klausel angeben, die die unteren und oberen Grenzen angibt. Der Optimierer der Anfrage generiert dann eine IN-Klausel, die nur die Werte in diesem Bereich enthält, und überspringt andere Partitionen.
Actian Data Platform Partitionierung
Partitionierung ist eine wesentliche Strategie beim Einsatz der Actian Data Platform, da sie auf Parallelität ausgelegt ist. Die Actian Data Platform ist so konzipiert, dass sie effizient arbeitet und die Cluster optimal nutzt, wenn mindestens eine Tabelle in jeder nicht-trivialen (verbindenden) Anfrage partitioniert ist. Das Fehlen einer geeigneten Partitionierung kann sich auf die Leistung auswirken, daher sollten Sie die Implementierung einer Partitionierung in Erwägung ziehen.
Bei der Partitionierung in der Actian Data Platform werden die Zeilen einer Tabelle auf Untertabellen (Partitionen) verteilt. Ein Partitionierungsschema bestimmt, welche Zeilen an welche Partitionen gesendet werden.
Die Partitionierung wird automatisch verwaltet. Um eine Tabelle mit einem expliziten Partitionierungsschema zu definieren, verwenden Sie die Option PARTITION= in der WITH-Klausel der CREATE TABLE-Anweisung. Da die automatische Partitionierung der Standard ist, muss die WITH PARTITION-Klausel nicht explizit angegeben werden.
Die Actian Data Platform unterstützt zwei Partitionierungsschemata, die eine Regel (Verteilungsschema) für die Zuordnung von Zeilen zu Partitionen definieren. Konzeptionell definiert eine Dimension eine Menge von logischen Partitionen. Die folgenden Verteilungstypen sind verfügbar:
- HASH - Verteilt die Zeilen gleichmäßig auf die Partitionen unter Verwendung eines Hash-Wertes (statt zufällig). Anhand eines Wertes für die Partitionierungsspalten kann eine Anfrage vorhersagen, welche Partition Zeilen enthält, die den entsprechenden Wert haben. Somit kann eine Anfrage ihre Suche auf eine Teilmenge von Partitionen beschränken. HASH ist datenabhängig und erfordert die ON-Klausel.
- AUTOMATIC - (Standard) Verteilt die Zeilen zufällig auf die Partitionen.
Das Verteilungsschema kann ein auf der Systemebene festgelegter Standardwert sein. Die optionalen logischen Partitionsnamen müssen für jede Tabelle eindeutig sein. Derselbe Partitionsname kann in anderen partitionierten Tabellen vorkommen. Wird ein Partitionsname weggelassen, generiert das System einen Namen (in der Form iipartnn).
Syntax der Partitionierung
Eine Tabellenpartitionsdefinition hat das folgende Format:
PARTITION = (Dimension)
Die Syntax für jede Partitionsdimension lautet:
dimension = Regel partitionspec{, partitionspec} Regel
Legt die Art des Verteilungsschemas für die Zuordnung von Zeilen zu Partitionen fest. Gültige Werte sind:
HASH ON column{, column}
Verteilt Zeilen gleichmäßig auf Partitionen gemäß einem Hash-Wert.
ON spalte{,spalte}
gibt die Spalten an, nach denen die Tabelle aufgeteilt werden soll.
AUTOMATIK
(Standard) Verteilt die Zeilen zufällig auf die Partitionen.
partitionspec
Legt die Anzahl der Partitionen und optional deren Namen fest:
partitionspec = DEFAULT PARTITIONS | [nn] PARTITION[S] [ ( name{, name} ) ]
wo:
STANDARD-PARTITIONEN
Verwendet die Standardanzahl von Partitionen, die für eine optimale Leistung auf der Grundlage der Größe Ihres Lagers konfiguriert sind.
Die Anweisung gibt einen Fehler zurück, wenn der Standardpartitionswert nicht gesetzt ist.
nn
Ist die Anzahl der Partitionen, die standardmäßig auf 1 gesetzt ist, wenn sie weggelassen wird.
Name
Identifiziert die Partition. Wenn die Anzahl der Partitionen zwei oder mehr beträgt, kann eine durch Komma getrennte Liste von Namen den Standardwert überschreiben.
Voreinstellung: iipartNN
Richtlinien für partitionierte Tabellen
Sie sollten den Schlüssel der Partition aus Spalten wählen, die einheitliche Werte haben, z. B. Primär-/Fremdschlüssel. Wenn Sie viele Abfragen erwarten, die die Tabellen A und B unter der Bedingung A.fk_col = B.col verbinden, sind fk_col und col gute Partitionsschlüssel für A und B.
Es wird eine Partition pro Kern und pro Knoten empfohlen:
num_partitions = num_nodes * K
wobei K ein Divisor für die Anzahl der physischen Kerne pro Knoten ist.
Das Erstellen eines Indexes auf Spalten, die eine Fremdbeziehung definieren, ist nicht erlaubt, wenn Tabellen, die durch die Fremdbeziehung verbunden sind, nicht die gleiche Anzahl von Partitionen haben oder nicht auf Spalten (oder eine passende Teilmenge) partitioniert sind, die für die Fremdschlüsselbeziehung verwendet werden. Zum Beispiel:
Folgendes ist erlaubt:
CREATE TABLE X (a i4 NOT NULL, b i4 NOT NULL, c i4 NOT NULL) WITH PARTITION=(HASH ON a,c 2 PARTITIONS); ALTER TABLE X ADD CONSTRAINT pk_x PRIMARY KEY (a,c); CREATE TABLE Y (c i4 NOT NULL, d i4 NOT NULL, e i4) WITH PARTITION=(HASH ON d,e 2 PARTITIONS); ALTER TABLE Y ADD CONSTRAINT fk_y FOREIGN KEY(d,e) REFERENCES X(a,c); CREATE INDEX idx_y ON Y(d,e);
Die Aufteilung der Schlüssel auf c für X und e für Y ist ebenfalls gültig.
Das Standard-Partitionierungsschema AUTOMATIC verteilt Zeilen zufällig und gleichmäßig auf die Partitionen. Anders als bei Hash-Tabellen ist bei Zeilen mit gleichen Werten nicht garantiert, dass sie derselben Partition zugeordnet werden. Infolgedessen muss das System in der Regel Daten reorganisieren, bevor es die Anfrage auflöst. Zum Beispiel erfordert das Verbinden von zwei automatisch partitionierten Tabellen in der Regel eine Neuordnung der Zeilen. Dieser zusätzliche Schritt kann die Leistung der Anfrage beeinträchtigen.
Die AUTOMATISCHE Partitionierung sollte in den folgenden Fällen verwendet werden:
- Wenn es an Erkenntnis fehlt, um einen guten Hash-Schlüssel zu erstellen. Das heißt, wenn:
- Es gibt keinen offensichtlichen Verbindungsschlüssel
- Es gibt keinen guten Kandidaten für die Hash-Verteilung der Tabelle (beliebige Daten)
- Die Tabelle hat keinen gemeinsamen Join-Schlüssel mit anderen Tabellen
- Die Tabelle ist eine temporäre Staging-Tabelle
- Wenn Sie eine automatisch partitionierte Tabelle als vorbereitenden Schritt vor der Erstellung eines guten Hash-Schlüssels definieren, können Sie CREATE STATISTICS und dann SELECT verwenden, um minimale und maximale Spaltenwerte und COUNTs zu erhalten, um besser auswählen zu können, welche Spalten als HASH-Verteilungsschlüssel verwendet werden sollen
Standard-Verteilungsschema
Beim Erstellen von partitionierten Tabellen können Sie ein Standardverteilungsschema zuweisen. Die Standardaufteilungseinstellung kann auf Sitzungsebene mit der Anweisung SET PARTITION_SCHEME überschrieben werden. Sie können bei der Erstellung von partitionierten Tabellen eine Standardanzahl von Partitionen zuweisen. Geben Sie beim Erstellen oder Ändern von Tabellen WITH PARTITION = (rule ON column DEFAULT PARTITIONS) an. Die Tabelle wird dann in die konfigurierte Anzahl von Partitionen unterteilt. Die Standardeinstellung für die Anzahl der Partitionen kann auf Sitzungsebene mit der Anweisung SET PARTITION_PARTS außer Kraft gesetzt werden.
CREATE TABLE Beispiele
Für Google Cloud erstellen Sie eine Tabelle mit standardmäßiger AUTOMATISCHER Partitionierung:
CREATE TABLE kunde ( custid INT NOT NULL DEFAULT 0, zip CHAR(5) NOT NULL)
Erstellen Sie eine Tabelle ohne Partitionierung:
CREATE TABLE kunde ( custid INT NOT NULL DEFAULT 0, zip CHAR(5) NOT NULL) MIT NOPARTITION;
Erstellen Sie eine HASH-partitionierte Tabelle mit 16 Partitionen, die anhand der Spalte emp_no verteilt sind:
CREATE TABLE employee ( emp_no INTEGER NOT NULL NOT DEFAULT, emp_name CHAR(32) NOT NULL NOT DEFAULT, dept_no INTEGER, emp_rating INTEGER) MIT JOURNALISIERUNG, PARTITION = (HASH ON emp_no 16 PARTITIONEN);
Erstellen Sie eine HASH-partitionierte Tabelle unter Verwendung der Standardpartitionsanzahl:
CREATE TABLE employee ( emp_no INTEGER NOT NULL NOT DEFAULT, emp_name CHAR(32) NOT NULL NOT DEFAULT, dept_no INTEGER, emp_rating INTEGER) MIT JOURNALISIERUNG, PARTITION = (HASH ON emp_no DEFAULT PARTITIONS);
Erstellen Sie eine Tabelle, in der die Sozialversicherungsnummer mit einer AES-128-Bit-Verschlüsselung verschlüsselt ist. Fügen Sie dem Feld 16 Bytes mit Zufallsbits hinzu, um den verschlüsselten Wert weiter zu verschleiern:
CREATE TABLE socsectab ( fname CHAR(10), lname CHAR(20), socsec CHAR(11) ENCRYPT NOSALT ) WITH ENCRYPTION=AES128, PASSPHRASE='dies ist ein Geheimnis', NOPARTITION;
Erstellen Sie eine Tabelle, in der die Daten der Spalte c2, die Gehaltsdaten enthält, mit AES 256-Bit verschlüsselt sind. Dem Feld wird standardmäßig Salz hinzugefügt:
CREATE TABLE t1 ( c1 CHAR(20) NOT NULL, c2 MONEY ENCRYPT) WITH ENCRYPTION=AES256, PASSPHRASE='decoder ring', NOPARTITION;
Erstellen Sie eine Tabelle mit einem gesampelten Min-Max-Index für zwei Spalten:
CREATE TABLE sales_fact ( sales_date ANSIDATE, wert INTEGER2, menge FLOAT8) WITH MINMAX=(umsatz_datum, menge), MINMAX_SAMPLES;
Erstellen Sie eine Tabelle, in der die Spalten Adresse und Gehalt ausgeblendet sind:
CREATE TABLE mitarbeiter( name VARCHAR(20), adresse VARCHAR(20) MASKED, gehalt FLOAT MASKED AS 0);
Erstellen Sie eine partitionierte Tabelle mit automatisch (d.h. zufällig) verteilten Zeilen:
CREATE TABLE employee ( emp_no INTEGER NOT NULL NOT DEFAULT, emp_name CHAR(32) NOT NULL NOT DEFAULT, dept_no INTEGER, emp_rating INTEGER) WITH PARTITION = (AUTOMATISCH 8 PARTITIONEN);
Erstellen Sie die Tabelle "Filme" ohne Partitionierung:
CREATE TABLE movies AS SELECT * FROM cinema WITH NOPARTITION;
Erstellen Sie die Tabelle "Bücher" mit der standardmäßigen AUTOMATISCHEN Partitionierung:
CREATE TABLE books AS SELECT * FROM titles;