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.