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

Prosedur tersimpan Rencana eksekusi SQL

Saya telah menjawab pertanyaan serupa di sini https://stackoverflow.com/a/26633820/3989608

Beberapa fakta tentang nilai NULL dan INDEX:

  • Seluruh kunci NULL tidak dimasukkan ke dalam B*Tree 'normal' di Oracle

  • Oleh karena itu, jika Anda memiliki indeks gabungan pada katakanlah C1 dan C2, maka Anda mungkin akan menemukan nilai NULL di dalamnya - karena Anda dapat memiliki baris di mana C1 adalah NULL tetapi C2 BUKAN NULL - nilai kunci itu akan ada di indeks.

Beberapa bagian dari demonstrasi oleh Thomas Kyte tentang hal yang sama:

[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.

Nah, indeks itu pasti bisa digunakan untuk memenuhi “IS NOT NULL” ketika diterapkan ke 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)

Faktanya – bahkan jika tabel tidak memiliki kolom NOT NULL, atau kita tidak ingin/perlu memiliki indeks gabungan yang melibatkan OWNER – ada cara transparan untuk menemukan nilai NULL OBJECT_ID dengan lebih mudah:

[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)

Sumber :Something about nothing oleh 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. Bagaimana cara menulis XML ke file (PL/SQL)?

  2. Fungsi NVL2 di Oracle

  3. Oracle SQL PLS-00049:variabel pengikatan buruk

  4. ORA-00942:tabel atau tampilan tidak ada untuk tabel dan kolom kasus campuran

  5. Cara mendapatkan bagian dari string yang cocok dengan ekspresi reguler di Oracle SQL