In plaats van te proberen uw eigen parser te schrijven, kunt u Oracle deze voor u laten ontleden via explain plan
, en kijk dan naar de plantabel om te zien naar welke objecten het verwijst:
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
Zoals @Aleksej suggereerde, als de optimizer alleen een index gebruikt (dus het uitvoeringsplan toont indextoegang/scan zonder de tabel te raken, omdat alle relevante kolommen in de index staan), dan rapporteert de plantabel alleen de index. Je zou dat kunnen toestaan door deel te nemen aan de indexweergave; als het ook op tafel komt, rapporteert het het gewoon voor beide:
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');
U moet er ook voor zorgen dat de plantabel leeg is vóór elke aanroep en query voor het uitleggen van een plan om verwarring te voorkomen, of een instructie-ID instellen zodat u kunt identificeren welke tabellen betrekking hebben op de huidige query.