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

Quy trình được lưu trữ Kế hoạch thực thi SQL

Tôi đã trả lời một câu hỏi tương tự tại đây https://stackoverflow.com/a/26633820/3989608

Một số thông tin về giá trị NULL và INDEX:

  • Các khóa hoàn toàn NULL không được nhập vào cây B * ‘bình thường’ trong Oracle

  • Do đó, nếu bạn có một chỉ mục nối trên C1 và C2, thì bạn có thể sẽ tìm thấy các giá trị NULL trong đó - vì bạn có thể có một hàng trong đó C1 là NULL nhưng C2 KHÔNG NULL - giá trị khóa đó sẽ nằm trong chỉ mục.

Một số phần của cuộc biểu tình của Thomas Kyte liên quan đến điều tương tự:

[email protected]> create table t
2  as
3  select object_id, owner, object_name
4    from dba_objects;
Table created.

[email protected]> alter table t modify (owner NOT NULL);
Table altered.

[email protected]> create index t_idx on t(object_id,owner);
Index created.

[email protected]> desc t
Name                    Null?    Type
----------------------- -------- ----------------
OBJECT_ID                        NUMBER
OWNER                   NOT NULL VARCHAR2(30)
OBJECT_NAME                      VARCHAR2(128)

[email protected]> exec dbms_stats.gather_table_stats(user,'T');
PL/SQL procedure successfully completed.

Chà, chỉ mục đó chắc chắn có thể được sử dụng để đáp ứng “KHÔNG ĐẦY ĐỦ” khi áp dụng cho OBJECT_ID:

[email protected]> set autotrace traceonly explain
[email protected]> select * from t where object_id is null;

Execution Plan
----------------------------------------------------------
0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=34)
1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=3 Card=1 Bytes=34)
2    1     INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=2 Card=1)

Trên thực tế - ngay cả khi bảng không có bất kỳ cột NOT NULL nào hoặc chúng tôi không muốn / cần phải có một chỉ mục được nối liên quan đến OWNER - thì có một cách rõ ràng để tìm các giá trị NULL OBJECT_ID khá dễ dàng:

[email protected]> drop index t_idx;
Index dropped.

[email protected]> create index t_idx_new on t(object_id,0);
Index created.

[email protected]> set autotrace traceonly explain
[email protected]> select * from t where object_id is null;

Execution Plan
----------------------------------------------------------
0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=34)
1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=3 Card=1 Bytes=34)
2    1     INDEX (RANGE SCAN) OF 'T_IDX_NEW' (NON-UNIQUE) (Cost=2 Card=1)

Nguồn: Đôi điều về hư không của Thomas Kyte



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao tôi nhận được lỗi này? Không thể chèn null vào 'VALUE.VALUE_TX'

  2. Không thể tạo Truy vấn đã nhập cho truy vấn có nhiều trả lại bằng cách sử dụng loại kết quả yêu cầu

  3. 27 tập lệnh oracle dba cho Cơ sở dữ liệu Oracle để Quản trị và Giám sát

  4. quyền truy cập bị từ chối khi sử dụng JDBC từ một applet của trình duyệt

  5. Cách kiểm tra điều kiện và viết văn bản vào biểu mẫu oracle tệp văn bản