sql >> データベース >  >> RDS >> Oracle

ストアドプロシージャSQL実行プラン

    私はここで同様の質問に答えました https://stackoverflow.com/a/26633820/3989608 >

    NULL値とINDEXに関するいくつかの事実:

    • 完全にNULLのキーは、Oracleの「通常の」B*ツリーには入力されません

    • したがって、たとえばC1とC2に連結されたインデックスがある場合、C1はNULLであるがC2はNULLではない行がある可能性があるため、そのキー値はインデックスに含まれる可能性があります。

    同じことに関するトーマス・カイトによるデモンストレーションの一部:

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

    そうですね、そのインデックスは、OBJECT_IDに適用されたときに「ISNOTNULL」を満たすために確かに使用できます:

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

    実際、テーブルにNOT NULL列がない場合、またはOWNERを含む連結インデックスが必要ない場合でも、NULLOBJECT_ID値を簡単に見つけるための透過的な方法があります。

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

    出典:ThomasKyteによる何もないこと



    1. Oracle11g-ピボット解除

    2. R12.2アップグレードパート-4のステップバイステップのアップグレードプロセス(12.2.xリリースアップデートパックの適用)

    3. LIMIT付きのINに代わるものはありますか?

    4. MySQLの一意のIDまたは結合されたID