Als ik het was, zou ik de neiging hebben om het probleem op een andere manier te benaderen. In plaats van een SQL-parser te schrijven (waarvoor veel meer nodig is dan een reguliere expressie, tenzij je kunt garanderen dat alle SQL-instructies een zeer kleine subset van de beschikbare SQL-grammatica gebruiken), zou ik de neiging hebben om een queryplan voor elk object te genereren en dan query PLAN_TABLE
om de objecten te zien die Oracle moet raken. U moet een extra zoekactie uitvoeren voor toegang tot de index om erachter te komen in welke tabel de index is gedefinieerd, maar dat zou redelijk eenvoudig moeten zijn.
Als u dit pad volgt, haalt u echter de basistabellen op die uw query daadwerkelijk raakt, in plaats van naar de weergaven waarnaar de query's daadwerkelijk verwijzen. Dat wil zeggen, als je een zoekopdracht hebt SELECT * FROM view_1
en view_1
, op zijn beurt, wordt gedefinieerd als een zoekopdracht tegen table_a
en table_b
, alleen table_a
en table_b
zal deel uitmaken van het plan. En je zou query_rewrite
moeten uitschakelen voor de sessie als u wilt voorkomen dat de queryplannen verwijzen naar gerealiseerde weergaven als die gerealiseerde weergaven niet specifiek deel uitmaakten van de zoekopdracht.
Als u voor elke zoekopdracht een
EXPLAIN PLAN FOR <<the query>>
je kunt dan
SELECT DISTINCT object_owner, object_name, object_type
FROM plan_table
om de lijst met objecten te krijgen. Als OBJECT_TYPE
is als INDEX%
, kunt u vervolgens de DBA_INDEXES
bekijken (of ALL_INDEXES
of USER_INDEXES
afhankelijk van wie eigenaar is van de objecten in kwestie en welk niveau van privileges u heeft) om te bepalen in welke tabel die index is gedefinieerd
SELECT table_owner, table_name
FROM dba_indexes
WHERE owner = <<object_owner from plan_table>>
AND index_name = <<object_name from plan_table>>
Dus als ik bijvoorbeeld een weergave heb view_1
create or replace view view_1
as
select *
from emp join dept using (deptno)
en een vraag
select * from view_1;
Ik kan doen
SQL> explain plan for select * from view_1;
Explained.
SQL> ed
Wrote file afiedt.buf
1 SELECT distinct object_owner, object_name, object_type
2* FROM plan_table
SQL> /
OBJECT_OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------------- -------------------------
SCOTT DEPT TABLE
SCOTT PK_DEPT INDEX (UNIQUE)
SCOTT EMP TABLE
Dit vertelt me dat de zoekopdracht daadwerkelijk de EMP
. bereikt en DEPT
tafels. Het raakt ook de PK_DEPT
index zodat ik kan kijken om te zien op welke tabel die is gedefinieerd.
SQL> ed
Wrote file afiedt.buf
1 SELECT table_owner, table_name
2 FROM dba_indexes
3 WHERE owner = 'SCOTT'
4* AND index_name = 'PK_DEPT'
SQL> /
TABLE_OWNER TABLE_NAME
------------------------------ ------------------------------
SCOTT DEPT
Het blijkt dat die index is gedefinieerd op de DEPT
tabel ook, dus ik weet dat alleen de EMP
en DEPT
tabellen in de SCOTT
schema worden betrokken bij de zoekopdracht.