Bestimmte Merkmale der verwendeten Tabellenbereiche können die Auswahl des Zugriffsplans durch den SQL-Compiler beeinflussen:
Behälterkenndaten können sich wesentlich auf den Ein-/Ausgabeaufwand, der mit der Ausführung einer Abfrage verbunden ist, auswirken. Bei der Auswahl eines Zugriffsplans berücksichtigt das SQL-Optimierungsprogramm diesen Ein-/Ausgabeaufwand, einschließlich aller Unterschiede in den Aufwänden für die Zugriffe auf Daten verschiedener Tabellenbereiche. Zwei Spalten im Systemkatalog SYSCAT.TABLESPACES werden vom Optimierungsprogramm zur Abschätzung der E/A-Aufwände für den Zugriff auf Daten in einem Tabellenbereich herangezogen:
Mit Hilfe der folgenden Formel läßt sich der Systemaufwand (OVERHEAD) abschätzen:
OVERHEAD = durchschnittliche Suchzeit in Millisekunden + (0,5 * rotationsbedingte Latenzzeit)
Dabei gilt folgendes:
(1 / U pro Minute) * 60 * 1000
Dabei erfolgen folgende Berechnungsschritte:
Als Beispiel sei eine Plattengeschwindigkeit von 7 200 Umdrehungen pro Minute angenommen. Dies ergäbe folgende Formel für die rotationsbedingte Latenzzeit:
(1 / 7200) * 60 * 1000 = 8,328 Millisekunden
Das Ergebnis kann anschließend in der Berechnung des Schätzwerts für OVERHEAD bei einer angenommenen durchschnittlichen Suchzeit von 11 Millisekunden verwendet werden:
OVERHEAD = 11 + (0,5 * 8,328) = 15,164
Der geschätzte OVERHEAD-Wert läge in diesem Fall bei ca. 15 Millisekunden.
Wenn jeder Tabellenbereichsbehälter eine einzelne physische Platte ist, können Sie mit Hilfe der folgenden Formel den Übertragungsaufwand pro Seite in Millisekunden abschätzen:
TRANSFERRATE = (1 / spec_rate) * 1000 / 1 024 000 * seitengröße
Dabei gilt folgendes:
Als Beispiel sei eine angegebene Übertragungsgeschwindigkeit (spec_rate) von 3 MB pro Sekunde angenommen. Daraus ergäbe sich folgende Berechnung:
TRANSFERRATE = (1 / 3) * 1000 / 1024000 * 4096 = 1,333248
Der geschätzte TRANSFERRATE-Wert läge hier bei ca. 1,3 Millisekunden pro Seite.
Wenn es sich bei den Tabellenbereichsbehältern nicht um einzelne physische Platten, sondern um Platteneinheiten (Disk-Arrays, z. B. RAID) handelt, sind zusätzliche Punkte bei der Abschätzung des zu verwendenden Werts von TRANSFERRATE beachten. Wenn die Platteneinheit relativ klein ist, können Sie den Wert für spec_rate mit der Anzahl Platten multiplizieren, da anzunehmen ist, daß der Engpaß auf Plattenebene liegt. Ist die Anzahl der Platten in der Einheit, die den Behälter bildet, jedoch groß, liegt der Engpaß vielleicht nicht auf Plattenebene, sondern bei einer der E/A-Subsystemkomponenten wie Einheiten-Controller, E/A-Busse oder dem Systembus. In diesem Fall kann nicht angenommen werden, daß der E/A-Durchsatz das Produkt aus spec_rate und der Anzahl der Platten ist. Statt dessen muß die tatsächliche E/A-Geschwindigkeit (in MB) während einer sequentiellen Tabellensuche gemessen werden. Zum Beispiel könnte eine Tabellensuche mit einer Anweisung wie select count(*) from große_tabelle durchgeführt werden, die mehrere MB umfaßt. Dividieren Sie das Ergebnis durch die Anzahl der Behälter, die den Tabellenbereich bilden, in dem große_tabelle gespeichert ist. Setzen Sie das Ergebnis für spec_rate in die oben angegebene Formel ein. Zum Beispiel würde eine gemessene sequentielle E/A-Geschwindigkeit von 100 MB beim Durchsuchen einer Tabelle in einem Tabellenbereich mit vier Behältern einen Wert von 25 MB pro Behälter bzw. einen TRANSFERRATE-Wert von (1/25) * 1000 / 1024000 * 4096 = 0,16 Millisekunden pro Seite bedeuten.
Jeder der einem Tabellenbereich zugeordneten Behälter kann sich auf einer anderen physischen Platte befinden. Um die besten Ergebnisse erzielen zu können, sollten alle physischen Platten, die für einen bestimmten Tabellenbereich verwendet werden, über die gleichen Werte für OVERHEAD und TRANSFERRATE verfügen. Wenn diese Merkmale nicht übereinstimmen, sollten Sie bei der Einstellung der Werte für OVERHEAD und TRANSFERRATE jeweils den Mittelwert verwenden.
Medienspezifische Werte für diese Spalten können Sie den technischen Daten zur Hardware entnehmen oder durch Experimentieren ermitteln. Diese Werte können in den Anweisungen CREATE TABLESPACE und ALTER TABLESPACE angegeben werden.
Experimentieren wird in der oben erwähnten Umgebung, in der vielleicht eine Platteneinheit als Behälter eingesetzt wird, besonders wichtig. Es empfiehlt sich, eine einfache Abfrage, die Daten versetzt, zu erstellen und sie in Verbindung mit einem plattformspezifischen Meßprogramm auszuführen. Anschließend können Sie die Abfrage mit anderen Behälterkonfigurationen innerhalb des Tabellenbereichs wiederholen. Mit Hilfe der Anweisungen CREATE und ALTER TABLESPACE können Sie die Art und Weise ändern, wie Daten in der Umgebung übertragen werden.
Die über diese beiden Werte verfügbaren Informationen zum Ein-/Ausgabeaufwand können das Optimierungsprogramm in mehrfacher Weise beeinflussen, zum Beispiel dahingehend, ob ein Index für den Zugriff auf die Daten zu verwenden ist und welche Tabellen als innere und äußere Tabellen in einer Verknüpfung auszuwählen sind.
Bei der Kalkulation des Ein-/Ausgabeaufwands für den Zugriff auf Daten in einem Tabellenbereich berücksichtigt das Optimierungsprogramm auch die potentiellen Auswirkungen, die das Vorablesen von Daten- und Indexseiten von Platten auf die Leistung der Abfrage haben kann. Der Vorablesezugriff auf Daten- und Indexseiten kann den Aufwand und die Wartezeit verringern, die mit dem Einlesen der Daten in den Pufferpool verbunden sind. Weitere Informationen finden Sie in Vorablesen von Daten in den Pufferpool.
Das Optimierungsprogramm verwendet die Informationen der Spalten PREFETCHSIZE und EXTENTSIZE im Systemkatalog SYSCAT.TABLESPACES, um die Menge der durch den Vorablesezugriff gelesenen Daten für einen Tabellenbereich abzuschätzen.
Das folgende Beispiel zeigt die Syntax zur Änderung der Merkmale des Tabellenbereichs RESOURCE:
ALTER TABLESPACE RESOURCE PREFETCHSIZE 64 OVERHEAD 19.3 TRANSFERRATE 0.9
Nach Durchführung von Änderungen an den Tabellenbereichen sollten Sie die Anwendungen erneut binden und das Dienstprogramm RUNSTATS zum Sammeln der aktuellsten Statistikdaten zu Indizes ausführen, um sicherzustellen, daß die besten Zugriffspläne verwendet werden.