Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle - Tabellennamen aus SQL-Text abrufen

Anstatt zu versuchen, Ihren eigenen Parser zu schreiben, können Sie ihn von Oracle über explain plan parsen lassen , und sehen Sie sich dann die Plantabelle an, um zu sehen, auf welche Objekte sie sich bezieht:

declare
  text varchar2(4000) := 'SELECT PT.PT_PARTY_NAME VALUE,PT.PT_PARTY_NAME LABEL
    FROM DWH_OWNER.DWH_ACCOUNTS ACC,
         DWH_OWNER.DWH_PARTIES PT
   WHERE ACC.ACC_SOURCE_ID = :P_DOMVAL_REF1
    AND ACC.ACC_PT_KEY = PT.PT_KEY';
begin
  execute immediate 'explain plan for ' || text;
end;
/

select distinct object_owner, object_name
from plan_table
where object_type = 'TABLE';

OBJECT_OWNER                   OBJECT_NAME                  
------------------------------ ------------------------------
DWH_OWNER                      DWH_ACCOUNTS                  
DWH_OWNER                      DWH_PARTIES                   

Wie @Aleksej vorgeschlagen hat, meldet die Plantabelle nur den Index, wenn der Optimierer nur einen Index verwendet (der Ausführungsplan zeigt also den Indexzugriff/Scan an, ohne die Tabelle zu treffen, da sich alle relevanten Spalten im Index befinden). Sie könnten dies zulassen, indem Sie der Indexansicht beitreten. wenn es auch auf den Tisch kommt, wird es nur für beide gemeldet:

select distinct case when pt.object_type = 'INDEX' then ai.table_owner
    else pt.object_owner end as owner,
  case when pt.object_type = 'INDEX' then ai.table_name
    else pt.object_name end as table_name
from plan_table pt
left join all_indexes ai on ai.owner = pt.object_owner
and ai.index_name = pt.object_name
where pt.object_type in ('TABLE', 'INDEX');

Sie müssen auch sicherstellen, dass die Plantabelle vor jedem Planaufruf und jeder Abfrage leer ist, um Verwirrung zu vermeiden, oder eine Anweisungs-ID festlegen, damit Sie identifizieren können, welche Tabellen sich auf die aktuelle Abfrage beziehen.