sql >> Database >  >> RDS >> Oracle

Opgeslagen procedure SQL-uitvoeringsplan

Ik heb hier een soortgelijke vraag beantwoord https://stackoverflow.com/a/26633820/3989608

Enkele feiten over NULL-waarden en INDEX:

  • Geheel NULL-sleutels worden niet ingevoerd in een 'normale' B*Tree in Oracle

  • Daarom, als je een aaneengeschakelde index hebt op bijvoorbeeld C1 en C2, dan zul je er waarschijnlijk NULL-waarden in vinden - aangezien je een rij zou kunnen hebben waarin C1 NULL is maar C2 NIET NULL - die sleutelwaarde zal in de index staan.

Een deel van de demonstratie van Thomas Kyte over hetzelfde:

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

Welnu, die index kan zeker worden gebruikt om te voldoen aan "IS NOT NULL" wanneer toegepast op 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)

Zelfs als de tabel geen NOT NULL-kolommen had, of als we geen aaneengeschakelde index met OWNER wilden/nodigden, is er een transparante manier om de NULL OBJECT_ID-waarden vrij gemakkelijk te vinden:

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

Bron:Iets over niets door Thomas Kyte



  1. PHP wit scherm van de dood elke keer. Wat doe ik verkeerd?

  2. Hoe krijg ik een ID in MSSQL in PHP?

  3. Vermijd exclusieve toegangsvergrendelingen op tabellen waarnaar wordt verwezen bij DROPping in PostgreSQL

  4. Wijzigingen in Oracle SQL-uitvoeringsplan vanwege interne conversie van SYS_OP_C2C