Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle - вземете име на таблица от sql текст

Вместо да се опитвате да напишете свой собствен анализатор, можете да оставите 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 на изявление, за да можете да идентифицирате кои таблици са свързани с текущата заявка.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изобразя дървовидна структура в хибернация с множество таблици?

  2. подзаявка - получаване на най-висок резултат

  3. Грешка в съхранената процедура на Oracle при избор

  4. Въпрос за присъединяване към SQL

  5. В Oracle възможно ли е да вмъкнете колона в таблица?