Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Parsing nama tabel dari sekumpulan pernyataan SQL

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. berapa banyak CPU yang dikonsumsi sesi pada waktu tertentu di Oracle

  2. Buat Ulang Node RAC Buruk

  3. Cara memuat DataFrame panda tipe campuran secara efisien ke dalam Oracle DB

  4. Jalankan Pernyataan atau Jalankan Script?

  5. Menghindari panggilan yang sering ke tampilan yang sama di dalam prosedur Oracle