Вместо да се опитвате да напишете свой собствен анализатор, можете да оставите Oracle да го анализира вместо вас чрез explain plan
и след това погледнете таблицата с планове, за да видите за кои обекти се отнася:
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
Както предложи @Aleksej, ако оптимизаторът използва само индекс (така че планът за изпълнение показва достъп/сканиране на индекс, без да удря таблицата, тъй като всички съответни колони са в индекса), тогава таблицата на плана отчита само индекса. Можете да позволите това, като се присъедините към изгледа на индекса; ако удари и масата, просто ще го докладва и за двете:
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');
Също така трябва да се уверите, че таблицата на плана е празна преди всяко извикване на плана за обяснение и заявка, за да избегнете объркване, или да зададете ID на изявление, за да можете да идентифицирате кои таблици са свързани с текущата заявка.