Es gibt eine Reihe von Faktoren, die bei der Entwicklung und Implementierung eines Vergleichstestprogramms in Betracht gezogen werden sollten. Da der Hauptzweck des Programms darin besteht, eine Benutzeranwendung zu simulieren, kann die allgemeine Struktur des Programms unterschiedlich sein. Es kann die gesamte Anwendung zum Vergleichstest verwendet werden, so daß nur die entsprechenden Mittel zur Erfassung der Zeiten für die zu analysierenden SQL-Anweisungen eingefügt werden müssen. Bei großen oder komplexen Anwendungen ist es eventuell praktischer, nur die Blöcke mit den wichtigen Anweisungen in das Vergleichstestprogramm aufzunehmen.
Zum Testen der Leistung bestimmter SQL-Anweisungen gibt es auch den Ansatz, nur diese Anweisungen allein in das Vergleichstestprogramm aufzunehmen und die benötigten Anweisungen CONNECT, PREPARE, OPEN und andere sowie Mechanismen zur Erfassung der Zeitdaten hinzuzufügen.
Ein weiterer wichtiger Gesichtspunkt ist die Art des Vergleichs, die verwendet werden sollte. Eine Möglichkeit ist die, eine Gruppe von SQL-Anweisungen über ein Zeitintervall wiederholt auszuführen. Das Verhältnis der Anzahl der ausgeführten Anweisungen zu diesem Zeitintervall ergäbe einen Wert für den Durchsatz für die Anwendung. Eine andere Möglichkeit ist die, einfach die für die Ausführung einzelner SQL-Anweisungen erforderliche Zeit zu bestimmen.
Ungeachtet der Art des Vergleichsprogramms ist ein effizientes Zeiterfassungssystem erforderlich, um die während der Verarbeitung entweder einzelner SQL-Anweisungen oder der gesamten Anwendung abgelaufene Zeit zu berechnen. Bei der Simulation von Anwendungen, in denen einzelne SQL-Anweisungen isoliert ausgeführt werden, kann es sehr sinnvoll sein, die Zeiten für die Anweisungen CONNECT, PREPARE und COMMIT zu ermitteln. Bei Programmen jedoch, die viele verschiedene Anweisungen verarbeiten, wird vielleicht nur eine einzige Anweisung CONNECT oder COMMIT benötigt, so daß die Erfassung der Ausführungszeit für eine einzelne Anweisung Priorität haben könnte.
Obwohl die Erfassung der benötigten Zeit für jede Abfrage einen wichtigen Faktor bei der Leistungsanalyse darstellt, werden durch sie nicht unbedingt potentielle Leistungsengpässe offengelegt. Zum Beispiel könnten Informationen über die CPU-Auslastung, über aktive Sperren und Pufferpoolein-/ausgaben Hinweise darauf geben, daß eine Anweisung durch die Ein-/Ausgabeaktivitäten gebremst wird, anstatt die CPU mit voller Kapazität auszunutzen. Ein Vergleichstestprogramm sollte es ermöglichen, diese Art von Daten für eine detailliertere Analyse bei Bedarf zu erfassen.
Nicht alle Anwendungen müssen die gesamte Menge der durch eine Abfrage abgerufenen Zeilen an eine Ausgabeeinheit senden. Einige Anwendungen können beispielsweise die als Ergebnis der Abfrage abgerufenen Zeilen als Eingabe für ein anderes Programm verwenden (d. h., keine der Zeilen wird an die Ausgabe weitergeleitet). Die Formatierung von Daten zur Ausgabe auf der Anzeige verursacht in der Regel einen hohen CPU-Aufwand und spiegelt den Benutzerbedarf nicht unbedingt wider. Um eine genaue Simulation zu erhalten, sollte ein Vergleichstestprogramm die Zeilenbehandlung der bestimmten Anwendung berücksichtigen. Wenn Zeilen an eine Ausgabeeinheit gesendet werden, könnte ineffizientes Formatieren den Hauptanteil der CPU-Verarbeitungszeit in Anspruch nehmen und so zu einer Verzerrung der tatsächlichen Leistungsdaten für die SQL-Anweisung als solche führen.
Das Vergleichstest-Tool db2batch: Es steht ein Vergleichstest-Tool (db2batch) im Unterverzeichnis bin des Verzeichnisses sqllib Ihres Exemplars zur Verfügung. In diesem Tool werden viele der obengenannten Punkte zur Erstellung eines Vergleichstestprogramms berücksichtigt. Dieses Tool liest SQL-Anweisungen entweder aus einer unstrukturierten Datei oder von der Standardeingabeeinheit, beschreibt die Anweisungen dynamisch und bereitet sie vor und liefert eine Antwortmenge zurück. Es verfügt außerdem über die zusätzliche Flexibilität, daß die Größe der Antwortmenge und die Anzahl der Zeilen, die aus dieser Anwortmenge an eine Ausgabeeinheit gesendet werden sollen, gesteuert werden können.
Darüber hinaus kann die Stufe der leistungsbezogenen Daten, die geliefert werden sollen, einschließlich der benötigten Zeit, CPU- und Pufferpoolauslastung, Sperren sowie anderer statistischer Daten aus dem Datenbankmonitor, angegeben werden. Bei der Zeitmessung für eine Gruppe von SQL-Anweisungen erstellt db2batch auch eine Ergebnisübersicht und berechnet arithmetische und geometrische Mittelwerte. Weitere Informationen zur Syntax des Aufrufs und der Optionen erhalten Sie, wenn Sie db2batch -h in eine Befehlszeile eingeben.
Darüber hinaus finden Sie im Handbuch Command Reference noch weitere Informationen zu db2batch.
Das folgende Beispiel zeigt, wie das Tool db2batch mit einer Eingabedatei db2batch.sql verwendet werden könnte:
Abbildung 97. Beispieleingabedatei für das Vergleichstest-Tool: db2batch.sql
-- db2batch.sql -- ------------ --#SET PERF_DETAIL 3 ROWS_OUT 5 -- This query lists employees, the name of their department -- and the number of activities to which they are assigned for -- employees who are assigned to more than one activity less than -- full-time. --#COMMENT Query 1 select lastname, firstnme, deptname, count(*) as num_act from employee, department, emp_act where employee.workdept = department.deptno and employee.empno = emp_act.empno and emp_act.emptime < 1 group by lastname, firstnme, deptname having count(*) > 2; --#SET PERF_DETAIL 1 ROWS_OUT 5 --#COMMENT Query 2 select lastname, firstnme, deptname, count(*) as num_act from employee, department, emp_act where employee.workdept = department.deptno and employee.empno = emp_act.empno and emp_act.emptime < 1 group by lastname, firstnme, deptname having count(*) <= 2; |
Geben Sie zum Beispiel den folgenden Aufruf für das Vergleichstest-Tool ein:
db2batch -d sample -f db2batch.sql
Dadurch wird die folgende Ausgabe erstellt:
Abbildung 98. Beispielausgabe des Programms db2batch (Teil 1)
--#SET PERF_DETAIL 3 ROWS_OUT 5 Query 1 Statement number: 1 select lastname, firstnme, deptname, count(*) as num_act from employee, department, emp_act where employee.workdept = department.deptno and employee.empno = emp_act.empno and emp_act.emptime < 1 group by lastname, firstnme, deptname having count(*) > 2 |
Abbildung 99. Beispielausgabe des Programms db2batch (Teil 1)
LASTNAME FIRSTNME DEPTNAME NUM_ACT
---------------------------------------------------------------------------
JEFFERSON JAMES ADMINISTRATION SYSTEMS 3
JOHNSON SYBIL ADMINISTRATION SYSTEMS 4
NICHOLLS HEATHER INFORMATION CENTER 4
PEREZ MARIA ADMINISTRATION SYSTEMS 4
SMITH DANIEL ADMINISTRATION SYSTEMS 7
Number of rows retrieved is: 5
Number of rows sent to output is: 5
Elapsed Time is: 0.074 seconds
Locks held currently = 0
Lock escalations = 0
Total sorts = 5
Total sort time (ms) = 0
Sort overflows = 0
Buffer pool data logical reads = 13
Buffer pool data physical reads = 5
Buffer pool data writes = 0
Buffer pool index logical reads = 3
Buffer pool index physical reads = 0
Buffer pool index writes = 0
Total buffer pool read time (ms) = 23
Total buffer pool write time (ms) = 0
Asynchronous pool data page reads = 0
Asynchronous pool data page writes = 0
Asynchronous pool index page reads = 0
Asynchronous pool index page writes = 0
Total elapsed asynchronous read time = 0
Total elapsed asynchronous write time = 0
Asynchronous read requests = 0
LSN Gap cleaner triggers = 0
Dirty page steal cleaner triggers = 0
Dirty page threshold cleaner triggers = 0
Direct reads = 8
Direct writes = 0
Direct read requests = 4
Direct write requests = 0
Direct read elapsed time (ms) = 0
Direct write elapsed time (ms) = 0
Rows selected = 5
Log pages read = 0
Log pages written = 0
Catalog cache lookups = 3
Catalog cache inserts = 3
Buffer pool data pages copied to ext storage = 0
Buffer pool index pages copied to ext storage = 0
Buffer pool data pages copied from ext storage = 0
Buffer pool index pages copied from ext storage = 0
Total Agent CPU Time (seconds) = 0.02
Post threshold sorts = 0
Piped sorts requested = 5
Piped sorts accepted = 5
Abbildung 100. Beispielausgabe des Programms db2batch (Teil 2)
--#SET PERF_DETAIL 1 ROWS_OUT 5 Query 2 Statement number: 2 select lastname, firstnme, deptname, count(*) as num_act from employee, department, emp_act where employee.workdept = department.deptno and employee.empno = emp_act.empno and emp_act.emptime < 1 group by lastname, firstnme, deptname having count(*) <= 2 LASTNAME FIRSTNME DEPTNAME NUM_ACT --------------------------------------------------------------------------- GEYER JOHN SUPPORT SERVICES 2 GOUNOT JASON SOFTWARE SUPPORT 2 HAAS CHRISTINE SPIFFY COMPUTER SERVICE DIV. 2 JONES WILLIAM MANUFACTURING SYSTEMS 2 KWAN SALLY INFORMATION CENTER 2 Number of rows retrieved is: 8 Number of rows sent to output is: 5 Elapsed Time is: 0.037 seconds Summary of Results ================== Elapsed Agent CPU Rows Rows Statement # Time (s) Time (s) Fetched Printed 1 0.074 0.020 5 5 2 0.037 Not Collected 8 5 Arith. mean 0.055 Geom. mean 0.052 |
Die gezeigte Beispielausgabe umfaßt spezifische Datenelemente, die vom Datenbanksystemmonitor geliefert werden. Weitere Informationen zu diesen und anderen Monitorelementen finden Sie im Handbuch System Monitor Guide and Reference.
Im folgenden Beispiel (unter UNIX) wird lediglich die Ergebnisübersicht (Summary of Results) erstellt.
db2batch -d sample -f db2batch.sql -r /dev/null
Mit diesem Aufruf wird nur die Ergebnisübersicht angezeigt. Durch die Option -r wird die Ausgabedatei 1 (outfile1) durch /dev/null ersetzt und die Ausgabedatei 2 (outfile2), die nur die Ergebnistabelle enthält, bleibt leer, so daß die Ausgabe von db2batch an die Anzeige gesendet wird:
Abbildung 101. Beispielausgabe des Programms db2batch - nur Ergebnistabelle
Summary of Results ================== Elapsed Agent CPU Rows Rows Statement # Time (s) Time (s) Fetched Printed 1 0.074 0.020 5 5 2 0.037 Not Collected 8 5 Arith. mean 0.055 Geom. mean 0.052 |
Dieses Vergleichstest-Tool verfügt darüber hinaus über die Option CLI. Mit dieser Option können Sie die Größe eines Cache angeben. Im folgenden Beispiel wird db2batch im CLI-Modus mit einer Cache-Größe von 30 Anweisungen ausgeführt:
db2batch -d sample -f db2batch.sql -cli 30