Anlegen eines eigenen Benutzerkontos
Ago 19

Koennen Arrays oder Records im Spreicher Performance gegen die Nutzung von kleinen Tabellen mitbringen?
Es ist schwierig zu beweisen welche Möglichkeit die beste ist, da es von der Belastung der Datenbank, die Konfiguration und andere Parameters abhängig ist, deswegen werde ich hier zwei Prozesse ausführen, deren Abläufe ich analysieren werde. Damit sehen wir, welcher Prozess sich besser im idealen Fall benehmt.

Beispiel

Wir haben eine WEB-Applikation entwieckelt, die in jedem Moment auf verschiedenen Servern laufen kann. Deswegen haben wir in einer Tabelle die vollständigen Addressen unseres WEB-Systemes gespeichert. Als einen Benutzer sich in unserem System einloggt, wird die aktuelle Addresse der Aplikation mit Hilfe der “Addresse” Tabelle erteilen. Gleichseitig andere Teile unseres System werden Programme ausführen, die mit PHP entwickelt wurden, die durch eine http Request Ausführung benutzt werden. Das heisst, die betroffene Tabelle wird häufig benutzt und sie hat sich in einem Problem umgewandelt. Wie Können mit diesem Problem umgehen? Mein Vorschlag ist die Nutzung von Arrays. Wir werden den Inhalt der Tabelle im einem Array speichern, der als Variable deklariert ist, und der immer im Cache sein wird. Mit dieser Vorgehensweise werden wir die Abfragen aus der Tabelle vermeiden und das Problem wird beheben.

Unsere Tabelle ist innerhalb einer Funktion eines Pakets abgefragt. Die Funktion gilt als Schnittstelle für die Anwendungen, die die Adressen des Servers benötigen. Das betroffene Paket werden wir für unseres Beispiel verdoppeln, die Kopie des Pakets wird die nachgefragte Adresse eines Servers von dem Array zurückgeben, anstatt der Tabelle zu benutzen.

Beschreibung der betroffenen Objekten:

1. Zwei Tabellen werden angelegt, deren Inhalt gleich sein wird. Grund dafür ist, dass für jeden Ablauf unserer zwei unterschiedlichen Prozesse die benutzten Tabellen sich nicht im Cache finden und deswegen muss jeder Ablauf durch Oracle analysiert werden.

hostname_mapping
hostname_mapping_array

2. Zwei Paketen werden angelet, die beiden werden die Tabelle bzw. Array als Quelle der Daten benutzen.

bis_utils
bis_utils_array

3. Neues “pa_table_to_array” Paket. Dieses Paket wird die Abfrage der Tabelle durch eine Suche aus der Daten des Array ersetzen.

pa_table_to_array

4. Um die Häufigkeit der Nutzung der Tabelle innerhalb des Systems werden wir zwei PL/SQL Skripten generieren. Jedes Skript enthält zwei Schleife, in deren 100.000 Ausführungen von den Funktionen bis_utils.get_host_url bzw. bis_utils_array.get_host_url durchgeführt werden. Innerhalb der PL/SQL Skripten wird die “trace” aktiviert und die verbrauchte Zeit jeder Schleife protokoliert.

pl_get_host_url_array.sql
pl_get_host_url_table.sql

5. Um einen realistischen Ablauf zu reproduzieren, werden wir ein UNIX-Shell-Skript entwickeln, das alternativ jedes PL/SQL Skript ausführen wird. Es wird auch das Ergebeniss in einer Datei protokollieren.

6. Am Ende der Ausführung des UNIX-Shell-Skriptes werden wir vier .trc Dateien auf dem /usr/lib/oracle/xe/app/oracle/admin/XE/udump Verzeichnis. Diese sind nicht lesbar, es sei denn, dass wir sie mit dem “tkprof” Oracles Befehls umwandeln:

tkprof datei_name.trc datei_name.out explain=fran/(PASSWORD)

-rw-r—– 1 oracle dba 29427133 2009-08-18 23:19 xe_ora_5478.trc
-rw-r—– 1 oracle dba 3809 2009-08-18 23:19 xe_ora_5482.trc
-rw-r—– 1 oracle dba 29429620 2009-08-18 23:20 xe_ora_5485.trc
-rw-r—– 1 oracle dba 3809 2009-08-18 23:20 xe_ora_5568.trc

Ergebnis:

Das Ergebnis zeigt, dass der Ablauf der “array” Funktion mehrfach schneller als der Ablauf der “table” Funktion ist:


* Ablauf der “TABLE” Funtkion:

Beginn des Prozess NORMAL, der die Tabelle benutzt
Ende des Prozess NORMAL. Zeit verbraucht : 16.24 seconds
Beginn des Prozess NORMAL, der die Tabelle benutzt
Ende des Prozess NORMAL. Zeit verbraucht : 16.2 seconds

* Ablauf der “ARRAY” Funtkion:

Beginn des Prozess ARRAY, der den Array benutzt
Ende des Prozess ARRAY. Zeit verbraucht : .97 seconds
Beginn des Prozess ARRAY, der den Array benutzt
Ende des Prozess ARRAY. Zeit verbraucht : .98 seconds

Analyse des Ergebnisses der trc Dateien:

* TRC-Datei des Ablaufes der Tabelle:

SELECT DECODE(H.PROTOCOL, NULL, ”, ”, ”, H.PROTOCOL || ‘://’) ||
H.HOSTNAME || DECODE(H.PORT, NULL, ”, ”, ”, ‘:’ || TO_CHAR(H.PORT))
FROM
HOSTNAME_MAPPING H WHERE H.HOSTALIAS = UPPER(:B2 ) AND H.ENTERPRISE_ID = :B1

call count cpu elapsed disk query current rows
——- —— ——– ———- ———- ———- ———- ———-
Parse 1 0.00 0.00 0 0 0 0
Execute 200000 7.40 4.76 0 0 0 0
Fetch 200000 15.39 8.36 0 600000 0 200000
——- —— ——– ———- ———- ———- ———- ———-
total 400001 22.79 13.12 0 600000 0 200000

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call count cpu elapsed disk query current rows
——- —— ——– ———- ———- ———- ———- ———-
Parse 4 0.00 0.00 0 0 0 0
Execute 5 10.63 19.92 0 3 0 3
Fetch 0 0.00 0.00 0 0 0 0
——- —— ——– ———- ———- ———- ———- ———-
total 9 10.63 19.92 0 3 0 3

Misses in library cache during parse: 0

OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call count cpu elapsed disk query current rows
——- —— ——– ———- ———- ———- ———- ———-
Parse 1 0.00 0.00 0 0 0 0
Execute 200000 7.40 4.76 0 0 0 0
Fetch 200000 15.39 8.36 0 600000 0 200000
——- —— ——– ———- ———- ———- ———- ———-
total 400001 22.79 13.12 0 600000 0 200000

* TRC-Datei des Ablaufes des Array:

SELECT *
FROM
HOSTNAME_MAPPING_ARRAY

call count cpu elapsed disk query current rows
——- —— ——– ———- ———- ———- ———- ———-
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.00 0.00 0 3 0 8
——- —— ——– ———- ———- ———- ———- ———-
total 3 0.00 0.00 0 3 0 8

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call count cpu elapsed disk query current rows
——- —— ——– ———- ———- ———- ———- ———-
Parse 4 0.00 0.00 0 0 0 0
Execute 5 1.90 1.91 0 3 0 3
Fetch 0 0.00 0.00 0 0 0 0
——- —— ——– ———- ———- ———- ———- ———-
total 9 1.90 1.91 0 3 0 3

Misses in library cache during parse: 0

OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call count cpu elapsed disk query current rows
——- —— ——– ———- ———- ———- ———- ———-
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.00 0.00 0 3 0 8
——- —— ——– ———- ———- ———- ———- ———-
total 3 0.00 0.00 0 3 0 8

Umgebung:

1. Betriebssystem: Ubuntu Server 9.04
2. Datenbank: Oracle Database 10g Express Edition Release 10.2.0.1.0 – Production.

Skripten, LOG-Dateien und “trc” Dateien:

mk_get_host_url.sql
cr_struktuk_get_host.sql
ins_get_host.sql
ins_get_host_array.sql
pa_table_to_array_ph.sql
pa_table_to_array_pb.sql
bis_utils_ph.sql
bis_utils_pb.sql
bis_utils_array_ph.sql
bis_utils_array_pb.sql
pl_get_host_url_table.sql
pl_get_host_url_array.sql
get_host_url.sh
get_host_url.log
xe_ora_5568.trc
xe_ora_5568.out
xe_ora_5478.trc
xe_ora_5478.out
xe_ora_5482.trc
xe_ora_5482.out
xe_ora_5485.trc
xe_ora_5485.out

Leave a Reply