Das Optimierungsprogramm kann einen Zugriffsplan so wählen, daß eine Abfrage parallel innerhalb einer Datenbankpartition ausgeführt wird, wenn ein Grad von Parallelität bei der Kompilierung der SQL-Anweisung angegeben wird.
Während der Ausführung werden mehrere Datenbankagenten, sogenannte "Subagenten", zur Ausführung der Abfrage erstellt. Die Anzahl von Subagenten ist kleiner oder gleich dem Grad von Parallelität, die bei der Kompilierung der SQL-Anweisung festgelegt wurde. Weitere Informationen zur Einstellung des Grads der Parallelität für SQL-Anweisungen finden Sie in Parallele Verarbeitung von Anwendungen. Weitere Informationen zu Agenten und Subagenten finden Sie in Datenbankagenten.
In einer partitionierten Datenbank gilt der Grad der Parallelität für jede Partition. Beispielsweise wird der Teil einer Abfrage, der in einer bestimmten Datenbankpartition ausgeführt wird, entsprechend dem Grad der Parallelität, der in dieser Datenbankpartition für die vorliegende SQL-Anweisung definiert wurde, noch weiter in parallele Ausführungseinheiten unterteilt.
Der Zugriffsplan wird parallelisiert, indem er in einen Teil, der von jedem Subagenten und einen Teil, der vom koordinierenden Agenten ausgeführt wird, aufgeteilt wird. Die Subagenten übergeben Daten über Tabellenwarteschlangen an den koordinierenden Agenten oder andere Subagenten. In einer partitionierten Datenbank können Subagenten Daten an Subagenten in anderen Datenbankpartitionen senden oder von ihnen empfangen.
In diesem Abschnitt werden die Parallelisierungsstrategien innerhalb einer einzelnen Datenbankpartition beschrieben.
Tabellensuchen und Indexsuchen können parallel in derselben Tabelle oder demselben Index ausgeführt werden. Für parallele Tabellensuchen wird die Tabelle in Seiten- oder Zeilenbereiche unterteilt. Je ein Bereich von Seiten oder Zeilen wird einem Subagenten zugewiesen. Ein Subagent durchsucht den ihm zugewiesenen Bereich und erhält einen anderen Bereich zugewiesen, wenn er mit dem Durchsuchen des aktuellen Bereichs fertig ist.
Für parallele Indexsuchen wird der Index in Bereiche von Datensätzen entsprechend den Indexschlüsselwerten und der Anzahl von Indexeinträgen für einen Schlüsselwert unterteilt. Die parallele Indexsuche wird wie die parallele Tabellensuche mit Subagenten durchgeführt, denen jeweils ein Bereich von Datensätzen zugewiesen wird. Einem Subagenten wird ein neuer Bereich zugewiesen, wenn er die Suche im aktuellen Bereich beendet hat.
Die Sucheinheit (Seite oder Zeile) sowie die Suchunterteilung werden vom Optimierungsprogramm festgelegt.
Beim parallelen Suchen wird die Arbeit gleichmäßig unter den Subagenten verteilt. Der Zweck der parallelen Suche besteht darin, die Belastung unter den Subagenten ausgewogen zu verteilen und sie gleichmäßig auszulasten. Wenn die Anzahl aktiver Subagenten gleich der Anzahl verfügbarer Prozessoren ist und die Platten nicht mit E/A-Anforderungen überlastet sind, werden die Ressourcen der Maschine effektiv genutzt.
Andere Zugriffsplanoperationen können eine unausgewogene Datenverteilung bei der Ausführung der Abfrage verursachen. Das Optimierungsprogramm wählt die Parallelstrategien so aus, daß die Datenausgewogenheit erhalten bleibt.
Das Optimierungsprogramm kann eine der folgenden parallelen Sortierstrategien auswählen:
Dies kann auch als "Umverteilungssortieren" bezeichnet werden. Dabei handelt es sich um eine effiziente Sortiermethode im gemeinsamen Speicher, bei der versucht wird, die Daten so gleichmäßig wie möglich an alle Subagenten zu verteilen. Zur Realisierung der gleichmäßigen Verteilung wird eine Art Reihumtaktgeberalgorithmus verwendet. Zunächst wird ein Sortiervorgang für jeden Subagenten erstellt. Während der Einfügephase fügen Subagenten Zeilen reihum in jeden der einzelnen Sortiervorgänge ein. Dadurch wird eine gleichmäßigere Verteilung von Daten erreicht.
Dies ist dem reihumverteilten Sortieren insofern ähnlich, als daß für jeden Subagenten ein Sortiervorgang erstellt wird. Die Subagenten wenden eine Hash-Funktion auf die Sortierspalten an, um festzulegen, in welchen Sortiervorgang eine Zeile eingefügt werden sollte. Wenn beispielsweise die innere und die äußere Tabelle einer Mischverknüpfung in einem partitionierten Sortiervorgang sind, kann ein Subagent mit Hilfe einer Mischverknüpfung die entsprechenden Partitionen verknüpfen. Dadurch kann die Mischverknüpfung parallel erfolgen.
Diese Art der Sortierung wird in Fällen verwendet, in denen alle Subagenten die gesamte Sortierausgabe benötigen. Es wird nur ein Sortiervorgang erstellt. Beim Einfügen von Zeilen in den Sortiervorgang sind die Subagenten synchronisiert. Nach Beendigung der Sortierung liest jeder Subagent das gesamte Sortierergebnis. Diese Art der Sortierung kann verwendet werden, um den Datenstrom wieder auszugleichen, wenn die Anzahl von Zeilen gering ist.
Diese Art der Sortierung entspricht der replizierten Sortierung, abgesehen davon, daß die Subagenten eine parallele Suche über das Sortierergebnis öffnen. Dadurch werden die Daten unter den Subagenten ähnlich wie bei der reihumverteilten Sortierung verteilt.
Subagenten können kooperieren, um eine temporäre Tabelle durch Einfügen von Zeilen in dieselbe Tabelle zu erstellen. Eine solche Tabelle ist eine gemeinsame temporäre Tabelle. Die Subagenten können private oder parallele Suchoperationen über die gemeinsame temporäre Tabelle öffnen, je nachdem, ob der Datenstrom zu replizieren oder zu partitionieren ist.
Spaltenberechnungen (Aggregation) können von Subagenten parallel durchgeführt werden. Eine Spaltenberechnung setzt voraus, daß die Daten nach den Gruppierungsspalten geordnet sind. Wenn ein Subagent sicher sein kann, daß er alle Zeilen für eine Reihe von Gruppierungsspaltenwerten erhält, kann er eine vollständige Spaltenberechnung (Aggregation) durchführen. Dies ist möglich, wenn der Strom bereits aufgrund einer früheren partitionierten Sortierung auf den Gruppierungsspalten partitioniert ist.
Andernfalls kann der Subagent eine partielle Spaltenberechnung durchführen und eine andere Strategie zur Vervollständigung der Spaltenberechnung anwenden. Einige dieser Strategien sind:
Verknüpfungsoperationen können von Subagenten parallel durchgeführt werden. Parallele Verknüpfungsstrategien werden durch die Merkmale des Datenstroms festgelegt.
Eine Verknüpfung kann parallelisiert werden, indem der Datenstrom nach dem inneren und äußeren Datenstrom der Verknüpfung partitioniert und/oder repliziert wird. Zum Beispiel kann eine Verknüpfung über Verschachtelungsschleife parallelisiert werden, wenn der äußere Datenstrom aufgrund einer Parallelsuche partitioniert ist und der innere Datenstrom von jedem Subagenten unabhängig neu ausgewertet wird. Eine Mischverknüpfung kann parallelisiert werden, wenn der innere und der äußere Datenstrom aufgrund partitionierter Sortierungen nach ihren Werten partitioniert sind.