standingzzz's Oracle memo

OracleSQLチューニングの豊富な経歴を生かして、主に11gと12cのオプティマイザ動作の違いなどについて、実用的な検証結果をメモしています。

Oracle12c NULLデータの割合によるインデックス性能確認

概要

データにNULLが多く含まれる場合のインデックス性能について確認します。

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
CentOS Linux release 7.3.1611 (Core) 

検証

パターンA NULLデータが全体の1%の場合

カージナリティとNULL割合の確認

select min(cnt) min_cnt, max(case when flg is not null then cnt end) max_cnt, sum(cnt) sum_cnt
     , sum(case when flg is null then cnt else 0 end) null_cnt
  from (select /*+ parallel(2) */
               flg
             , count(*) cnt
          from TAB_NULL_DATA
         group by
               flg
       )

   MIN_CNT    MAX_CNT    SUM_CNT   NULL_CNT
---------- ---------- ---------- ----------
        10         10   10000000     100000
パターンB NULLデータが全体の10%の場合

カージナリティとNULL割合の確認

   MIN_CNT    MAX_CNT    SUM_CNT   NULL_CNT
---------- ---------- ---------- ----------
        10         10   10000000    1000000
パターンB NULLデータが全体の50%の場合

カージナリティとNULL割合の確認

   MIN_CNT    MAX_CNT    SUM_CNT   NULL_CNT
---------- ---------- ---------- ----------
        10         10   10000000    5000000
パターンB NULLデータが全体の90%の場合

カージナリティとNULL割合の確認

   MIN_CNT    MAX_CNT    SUM_CNT   NULL_CNT
---------- ---------- ---------- ----------
        10         10   10000000    9000000

と言う事で、NULLデータの割合は性能に影響しませんでした。