Datenbanken - von am Sunday, September 23, 2007 17:45 - 0 Kommentare

Native Kompilierung von PL/SQL-Routinen in Oracle 10g

Tags: , ,

PL/SQL Erweiterungen und Verbesserungen in Oracle 10g
Teil 1: Native Kompilierung von PL/SQL Routinen

Viele Java / J2EE Systeme werden für ein Systemumfeld geschrieben, in welchem Oracle Datenbanken zum Einsatz kommen. Daher wollen wir uns in dieser Serie anschauen, wie man die Oracle Datenbank noch effektiver einsetzen kann. Derzeit ist es primär die Oracle 10g Datenbank, die zum Einsatz kommt und Oracle hat mit diesem Release diverse Erweiterungen für PL/SQL veröffentlicht.
Wer noch nicht weiß, was PL/SQL ist kann sich in der Wikipedia aufschlauen.

Nativer C-Code in PL/SQL Routinen

PL/SQL kann ab der Version 9i in nativen Maschinencode kompiliert werden. Bisher mussten dafür immer diverse Kompilierparameter in der init.ora gesetzt werden. Ab 10g wird dafür einfach der betriebssystemspezifische C-Compiler herangezogen. Leidiglich der init.ora-Parameter PLSQL_NATIVE_LIBRARY_DIR muss noch gesetzt werden, der angibt, wo die dann kompilierten PL/SQL Routinen liegen.

Um eine PL/SQL-Stored Procedure oder Stored Function in nativen Code zu kompilieren wird vor der Kompilierung einfach

  1. ALTER SESSION SET PLSQL_CODE_TYPE = NATIVE;

oder

  1. ALTER SESSION SET PLSQL_CODE_TYPE = NATIVE;

gesetzt. Unter kompilieren wird in diesem Zusammenhang das Erzeugen eines PL/SQL Packages oder einer einzelnen PL/SQL Routine verstanden:

  1. CREATE OR REPLACE FUNCTION ...
  2. CREATE OR REPLACE PROCEDURE ...
  3. CREATE OR REPLACE PACKAGE ...

Beispiel:

  1. CREATE OR REPLACE PROCEDURE servertest AS
  2. a NUMBER := 0;
  3. BEGIN
  4.  FOR c IN 1..1000000
  5.  LOOP
  6.    a := a + 1;
  7.  END LOOP;
  8. END;
  9. /

Mit Hilfe der Data Dictionary View kann abgefragt werden, ob eine PL/SQL Routine nativ kompiliert wurde:

  1. SELECT PLSQL_CODE_TYPE FROM DBA_PLSQL_OBJECT_SETTINGS WHERE UPPER(NAME) =’SERVERTEST’;

Um wieder mit interpretierten Code arbeiten zu können wird der Datenbank dies entweder mittels

  1. ALTER PROCEDURE servertest COMPILE PLSQL_CODE_TYPE = INTERPRETED;

oder

  1. ALTER SESSION SET PLSQL_CODE_TYPE = INTERPRETED;
  2. ALTER PROCEDURE servertest COMPILE;

wie auch

  1. ALTER SYSTEM SET PLSQL_CODE_TYPE = INTERPRETED;
  2. ALTER PROCEDURE servertest COMPILE;

und nachfolgender Kompilierung mitgeteilt.

Zum Anpassen aller bisherigen PL/SQL Routinen in der Instanz in einem Rutsch hält Oracle das Paket dbmsupgnv.sql bereit, welches in die Instanz eingelesen werden kann.

Ebenfalls können in nativen Code kompilierte Routinen wieder in „normalen“ zu interpretieren Code übersetzt werden. Hierfür gibt es das Paket dbmsupgin.sql, welches ebenfalls einfach in die Instanz eingelesen werden kann.

Beispiel des Vorteils von nativen Code:

Folgendes Beispiel verdeutlicht die Schnelligkeit von nativen Code gegenüber herkömmlichen PL/SQL Code:

  1. SQL> alter session set PLSQL_CODE_TYPE = INTERPRETED;
  2.  
  3. SQL> CREATE OR REPLACE PROCEDURE servertest AS
  4. a NUMBER := 0;
  5. BEGIN
  6.  FOR c IN 1.. 100000000
  7.  LOOP
  8.    a := a + 1;
  9.  END LOOP;
  10. END;
  11. /
  12.  
  13. SQL> SET TIMING ON;
  14. SQL> exec servertest;
  15.  
  16. PL/SQL-Prozedur erfolgreich abgeschlossen
  17.  
  18. Abgelaufen: 00:00:08.82
  19.  
  20. SQL> alter session set PLSQL_CODE_TYPE = NATIVE;
  21.  
  22. SQL> CREATE OR REPLACE PROCEDURE servertest AS
  23. a NUMBER := 0;
  24. BEGIN
  25.  FOR c IN 1..100000000
  26.  LOOP
  27.    a := a + 1;
  28.  END LOOP;
  29. END;
  30. /
  31.  
  32. SQL> SET TIMING ON;
  33.  
  34. SQL> EXEC nativetest
  35.  
  36. PL/SQL-Prozedur erfolgreich abgeschlossen.
  37. Abgelaufen: 00:00:06.04

Es sei hier erwähnt, dass die PL/SQL Routinen ihren größten Gewinn aus der nativen Kompilierung bei prozessorintensiven Berechnungen erzielen. Werden in den Routinen lediglich einfache Datenbankzugriffe abgebildet, so ist hier kaum mit einer Geschwindigkeitserhöhung zu rechnen.

Im nächsten Teil dieser Serie werden wir uns den durch Oracle 10g bereitgestellte WebService Funktionalitäten für Stored Procedures und Stored Functions widmen.

Weiterführende Literatur

Die meiner Meinung nach beste Einführung in Oracle und in die Entwicklung von Oracle-Anwendungen nennt sich “Beginning Oracle Programming“. Einer der drei Autoren ist Tom Kyte, von http://asktom.oracle.com, dem Experten unter den Oracle-Experten. Hervorzuheben bei diesem Buch sind die zahlreichen und sehr gut verständlichen Beispiele, sowie die lockere Schreibe.

Wenn es in die Oracle-Architektur gehen soll ist “Expert Oracle Database Architecture“, auch von Tom Kyte, zu empfehlen. Er geht in diesem Buch auf die Versionen 9i und 10g ein und auch hier finden sich zahlreiche Beispiele anhand dieser die Erklärungen veranschaulicht werden.

Für alle, die auf Informationen zur Entwicklung von effektiven und hochperformanten Oracle-Anwendungen aus sind empfiehlt sich “Effective Oracle By Design” von, wie sollte es anders sein, Tom Kyte. Die Benutzung von SQL*Plus, TKPROF und dem STATSPACK sind genauso Bestandteil des Buches wie auch eine gute Einführung in die Nutzung des Cost-Based-Optimizers (CBO) und wie performanter PL/SQL-Code zu schreiben ist.

Be Sociable, Share!


Kommentare

Kommentieren

Weitere Empfehlungen: