Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Phân tích cú pháp tên bảng từ một loạt câu lệnh SQL

Nếu là tôi, tôi sẽ có xu hướng cố gắng tiếp cận vấn đề theo một cách khác. Thay vì viết một trình phân tích cú pháp SQL (sẽ yêu cầu nhiều hơn một biểu thức chính quy trừ khi bạn có thể đảm bảo rằng tất cả các câu lệnh SQL sử dụng một tập con rất nhỏ của ngữ pháp SQL có sẵn), tôi sẽ có xu hướng tạo một kế hoạch truy vấn cho từng đối tượng và sau đó truy vấn PLAN_TABLE để xem các đối tượng mà Oracle phải đánh. Bạn cần thực hiện tra cứu bổ sung đối với các quyền truy cập chỉ mục để tìm ra bảng mà chỉ mục được xác định nhưng điều đó phải đơn giản một cách hợp lý.

Tuy nhiên, nếu bạn đi xuống đường dẫn này, bạn sẽ truy xuất các bảng cơ sở mà truy vấn của bạn thực sự chạm vào thay vì bất kỳ chế độ xem nào mà các truy vấn có thể thực sự tham chiếu đến. Nghĩa là, nếu bạn có truy vấn SELECT * FROM view_1view_1 đến lượt nó, được định nghĩa là một truy vấn đối với table_atable_b , chỉ table_atable_b sẽ là một phần của kế hoạch. Và bạn sẽ cần phải tắt query_rewrite cho phiên nếu bạn muốn ngăn các kế hoạch truy vấn tham chiếu đến các chế độ xem hiện thực hóa nếu các chế độ xem cụ thể hóa đó không phải là một phần cụ thể của truy vấn.

Nếu, đối với mỗi truy vấn, bạn thực hiện một

EXPLAIN PLAN FOR <<the query>>

sau đó bạn có thể

SELECT DISTINCT object_owner, object_name, object_type
  FROM plan_table

để lấy danh sách các đối tượng. Nếu OBJECT_TYPE giống như INDEX% , sau đó bạn có thể sử dụng DBA_INDEXES xem (hoặc ALL_INDEXES hoặc USER_INDEXES tùy thuộc vào người sở hữu các đối tượng được đề cập và bạn có mức đặc quyền nào) để xác định bảng mà chỉ mục đó được xác định

SELECT table_owner, table_name
  FROM dba_indexes
 WHERE owner = <<object_owner from plan_table>>
   AND index_name = <<object_name from plan_table>>

Vì vậy, ví dụ:nếu tôi có một chế độ xem view_1

 create or replace view view_1
 as
 select *
   from emp join dept using (deptno)

và một truy vấn

select * from view_1;

Tôi có thể làm

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

Điều này cho tôi biết rằng truy vấn thực sự đang đánh vào EMPDEPT những cái bàn. Nó cũng đang đánh vào PK_DEPT chỉ mục để tôi có thể xem bảng được xác định trên.

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

Hóa ra, chỉ mục đó được xác định trên DEPT cũng như bảng, vì vậy tôi biết rằng chỉ có EMPDEPT các bảng trong SCOTT lược đồ sẽ tham gia vào truy vấn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:Làm thế nào để biết được có một giao dịch đang chờ xử lý hay không?

  2. Một truy vấn SQL oracle có thể thực hiện một truy vấn chuỗi được chọn từ một bảng không?

  3. Làm cách nào để kiểm tra NLS_LANG của máy khách?

  4. ORA-01438:giá trị lớn hơn độ chính xác được chỉ định cho phép đối với cột này - Làm cách nào để lấy cột mà nó đang đề cập đến?

  5. Cập nhật bản vá quan trọng của Oracle - tháng 10 năm 2020