Istället för att försöka skriva din egen parser kan du låta Oracle analysera den åt dig via explain plan
, och titta sedan på plantabellen för att se vilka objekt den refererar till:
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
Som @Aleksej föreslog, om optimeraren bara använder ett index (så att exekveringsplanen visar indexåtkomst/skanning utan att träffa tabellen, eftersom alla relevanta kolumner finns i indexet) så rapporterar plantabellen bara indexet. Du kan tillåta det genom att gå med i indexvyn; om det träffar bordet också kommer det bara att rapportera det för båda:
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');
Du måste också se till att plantabellen är tom före varje förklarande plananrop och fråga för att undvika förvirring, eller ange ett uttalande-ID så att du kan identifiera vilka tabeller som är relaterade till den aktuella frågan.