Jika saya, saya cenderung mencoba mendekati masalah dengan cara yang berbeda. Daripada menulis parser SQL (yang akan membutuhkan lebih dari ekspresi reguler kecuali Anda dapat menjamin bahwa semua pernyataan SQL menggunakan subset yang sangat kecil dari tata bahasa SQL yang tersedia), saya akan cenderung membuat rencana kueri untuk setiap objek dan kemudian kueri PLAN_TABLE untuk melihat objek yang harus dipukul Oracle. Anda perlu melakukan pencarian tambahan untuk akses indeks untuk mengetahui tabel apa yang ditentukan oleh indeks, tetapi itu harus cukup mudah.
Namun, jika Anda mengikuti jalur ini, Anda akan mengambil tabel dasar yang benar-benar disentuh oleh kueri Anda daripada tampilan apa pun yang sebenarnya dirujuk oleh kueri tersebut. Yaitu, jika Anda memiliki kueri SELECT * FROM view_1 dan view_1 , pada gilirannya, didefinisikan sebagai kueri terhadap table_a dan table_b , hanya table_a dan table_b akan menjadi bagian dari rencananya. Dan Anda harus menonaktifkan query_rewrite untuk sesi jika Anda ingin mencegah rencana kueri mereferensikan tampilan yang terwujud jika tampilan yang terwujud itu bukan bagian khusus dari kueri.
Jika, untuk setiap kueri, Anda melakukan
EXPLAIN PLAN FOR <<the query>>
Anda kemudian dapat
SELECT DISTINCT object_owner, object_name, object_type
FROM plan_table
untuk mendapatkan daftar objek. Jika OBJECT_TYPE seperti INDEX% , Anda kemudian dapat menggunakan DBA_INDEXES lihat (atau ALL_INDEXES atau USER_INDEXES tergantung pada siapa yang memiliki objek yang dimaksud dan tingkat hak istimewa apa yang Anda miliki) untuk menentukan tabel apa yang ditentukan oleh indeks
SELECT table_owner, table_name
FROM dba_indexes
WHERE owner = <<object_owner from plan_table>>
AND index_name = <<object_name from plan_table>>
Jadi, misalnya, jika saya memiliki tampilan view_1
create or replace view view_1
as
select *
from emp join dept using (deptno)
dan kueri
select * from view_1;
saya bisa
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
Ini memberi tahu saya bahwa kueri sebenarnya mengenai EMP dan DEPT tabel. Itu juga mengenai PK_DEPT index jadi saya bisa melihat untuk melihat tabel apa yang didefinisikan.
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
Ternyata, indeks itu didefinisikan pada DEPT tabel juga, jadi saya tahu bahwa hanya EMP dan DEPT tabel di SCOTT skema akan terlibat dalam kueri.