DOAG Datenbank Kolumne: Kann man die SQL Id ohne SQL-Statement-Ausführung erhalten?

  • Erstellt von Ulrike Schwinn
  • Datenbank Kolumne, Datenbank

Ulrike Schwinn zeigt, mit welchem kleinen Trick sich eine SQL Id ohne Ausführung ausgeben lässt.

Ich beginne zuerst mit der einfacheren Frage: Wie findet man eigentlich die SQL Id – der sogenannte "SQL Identifier"– eines SQL-Statements?

Diese Anforderung stellt sich immer wieder, wenn es um SQL-Tuning oder Monitoring geht.

Die Antwort hierauf ist einfach: Die SQL Id lässt sich beispielsweise aus AWR- oder ASH-Berichten selektieren oder man verwendet die Spalte namens SQL_ID in den verschiedenen Data Dictionary Views. In SQL*Plus bietet sich ab der Oracle-Datenbank Version 18c sogar eine weitere Lösung an. Mit dem Kommando "SET FEEDBACK ON SQL_ID" wird die SQL_ID automatisch nach einer Statement-Ausführung ausgegeben.

 

SQL> set feedback on SQL_ID

SQL> select sysdate from dual;

SYSDATE

--------------------------

04-May-2022 09:48:03

 

1 row selected.

SQL_ID: 7h35uxf5uhmm1

 

Aber wie lautet jetzt die Antwort auf meine ursprüngliche Frage: Gibt es eine Möglichkeit, die SQL Id zu erhalten, OHNE das SQL-Statement vorher auszuführen?

Das PL/SQL-Package DBMS_SQL_TRANSLATOR macht es möglich. Seit Oracle Database 12c gibt es einen Übersetzungs-Mechanismus namens SQL Translation Framework, der die SQL-Anweisungen eines Client-Programms von einem fremden (nicht-Oracle) SQL-Dialekt in den vom SQL-Compiler der Oracle Database verwendeten SQL-Dialekt übersetzt. Das Package DBMS_SQL_TRANSLATOR liefert die Schnittstelle zum Erstellen, Konfigurieren und Verwenden der sogenannten SQL-Translation-Profile. Überprüft man die zugehörigen Funktionen und Prozeduren in der Dokumentation, findet man eine Funktion mit dem vielversprechenden Namen SQL_ID, die auch ohne Translation-Profile verwendet werden kann.
Sie berechnet die SQL Id mit einem einzigen Aufruf, wie das folgende Beispiel zeigt:

 

SQL> set serveroutput on

SQL> r

  1  declare

  2  p_id varchar2(1000);

  3  begin

  4  p_id:=dbms_sql_translator.sql_id('select sysdate from dual');

  5  dbms_output.put_line(p_id);

  6* end;

 

7h35uxf5uhmm1

PL/SQL procedure successfully completed.

 

Fertig! So einfach geht das. Mit diesem kleinen Trick lässt sich die SQL Id ohne Ausführung ausgeben.

 

Ulrike Schwinn

 

Bild von Noupload auf Pixabay