Wenn ich es wäre, würde ich versuchen, das Problem anders anzugehen. Anstatt einen SQL-Parser zu schreiben (der viel mehr als einen regulären Ausdruck erfordern würde, es sei denn, Sie können garantieren, dass alle SQL-Anweisungen eine sehr kleine Teilmenge der verfügbaren SQL-Grammatik verwenden), würde ich eher einen Abfrageplan für jedes Objekt generieren und dann PLAN_TABLE
abfragen um die Objekte zu sehen, die Oracle treffen muss. Sie müssten eine zusätzliche Suche nach Indexzugriffen durchführen, um herauszufinden, auf welcher Tabelle der Index definiert ist, aber das sollte ziemlich einfach sein.
Wenn Sie diesen Weg gehen, werden Sie jedoch die Basistabellen abrufen, die Ihre Abfrage tatsächlich berührt, und nicht die Ansichten, auf die sich die Abfragen möglicherweise tatsächlich beziehen. Das heißt, wenn Sie eine Abfrage haben SELECT * FROM view_1
und view_1
ist wiederum als Abfrage für table_a
definiert und table_b
, nur table_a
und table_b
wird Teil des Plans sein. Und Sie müssten query_rewrite
deaktivieren für die Sitzung, wenn Sie verhindern wollten, dass die Abfragepläne auf materialisierte Ansichten verweisen, wenn diese materialisierten Ansichten nicht ausdrücklich Teil der Abfrage waren.
Wenn Sie für jede Abfrage eine
EXPLAIN PLAN FOR <<the query>>
Sie können dann
SELECT DISTINCT object_owner, object_name, object_type
FROM plan_table
um die Liste der Objekte zu erhalten. Wenn OBJECT_TYPE
ist wie INDEX%
, können Sie dann die DBA_INDEXES
verwenden Ansicht (oder ALL_INDEXES
oder USER_INDEXES
abhängig davon, wem die fraglichen Objekte gehören und welche Privilegien Sie haben), um festzustellen, in welcher Tabelle dieser Index definiert ist
SELECT table_owner, table_name
FROM dba_indexes
WHERE owner = <<object_owner from plan_table>>
AND index_name = <<object_name from plan_table>>
Also zum Beispiel, wenn ich eine Ansicht view_1
habe
create or replace view view_1
as
select *
from emp join dept using (deptno)
und eine Abfrage
select * from view_1;
Ich kann
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
Dies sagt mir, dass die Abfrage tatsächlich den EMP
trifft und DEPT
Tische. Es trifft auch den PK_DEPT
index, damit ich nachsehen kann, in welcher Tabelle das definiert ist.
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
Wie sich herausstellt, ist dieser Index auf DEPT
definiert Tabelle auch, also kenne ich das nur vom EMP
und DEPT
Tabellen im SCOTT
schema werden an der Abfrage beteiligt sein.