質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • SQL

    2176questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • Oracle

    560questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

【Oracle】統計情報取得後に実行計画のコストが高くなるのは何故?

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 128

ametyan

score 7

下記のようにテーブル&レコード作成した環境で統計情報の取得前と取得後の実行計画を比較してみました。
すると、統計情報取得後の方がコストが高くなっているのですが、これはどうしてなのでしょうか?

■環境準備

-- テーブル作成
CREATE TABLE JOB_MASTER (
    UPD_TIME      DATE DEFAULT SYSDATE
   ,NAME_ID       CHAR(8)
   ,JOB_ID        CHAR(6)
   ,TSUBAN        NUMBER(10)
   ,COMPANY_NAME  VARCHAR(30)
   ,EXIST_FLG     CHAR(1)
   ,SAVE_MONEY    NUMBER(15)
   ,PRIMARY KEY(NAME_ID, JOB_ID)
)

-- データ作成
BEGIN
    FOR I IN 1..1000000 LOOP
        INSERT INTO JOB_MASTER
          SELECT SYSDATE
                 ,LPAD(I, 8, 'N')
                 ,LPAD(I, 6, 'J')
                 ,I
                 ,DBMS_RANDOM.STRING('A', 30)
                 ,'0'
                 ,ABS(DBMS_RANDOM.VALUE(0, 999999999999999))
          FROM DUAL;
    END LOOP;
    COMMIT;
END;
/

実行計画取得対象SQL

DELETE FROM JOB_MASTER WHERE NAME_ID <= 'NN453214';

■統計情報取得前

353,216行削除されました。

Plan hash value: 3759745238

---------------------------------------------------------------------------------
| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | DELETE STATEMENT  |             |   117 |  2106 |    60   (0)| 00:00:01 |
|   1 |  DELETE           | JOB_MASTER  |       |       |            |          |
|*  2 |   INDEX RANGE SCAN| SYS_C008248 |   117 |  2106 |    60   (0)| 00:00:01 |
---------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("NAME_ID"<='NN453214')

Note
-----
   - dynamic sampling used for this statement (level=2)

   Statistics
-----------------------------------------------------------
             603  CPU used by this session
             603  CPU used when call started
            1167  DB time
             216  enqueue conversions
             399  enqueue releases
             401  enqueue requests
             323  messages sent
            8592  non-idle wait count
             579  non-idle wait time
              84  opened cursors cumulative
               1  opened cursors current
            8548  physical read total IO requests
        82534400  physical read total bytes
              51  physical write total IO requests
        12804096  physical write total bytes
              50  physical write total multi block requests
               1  pinned cursors current
             725  recursive calls
               3  recursive cpu usage
          399179  session logical reads
             564  user I/O wait time
               6  user calls

■統計情報取得

-- 統計情報取得(第一引数はスキーマ名)
EXECUTE DBMS_STATS.GATHER_TABLE_STATS('SYS', 'JOB_MASTER');

■統計情報取得後

353,216行削除されました。

Plan hash value: 941518712

---------------------------------------------------------------------------------
| Id  | Operation          | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |            |   996K|    15M|  2929   (2)| 00:00:36 |
|   1 |  DELETE            | JOB_MASTER |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| JOB_MASTER |   996K|    15M|  2929   (2)| 00:00:36 |
---------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("NAME_ID"<='NN453214')

   Statistics
-----------------------------------------------------------
            1650  CPU used by this session
            1650  CPU used when call started
            2276  DB time
              90  enqueue conversions
             441  enqueue releases
             443  enqueue requests
               1  enqueue waits
             329  messages sent
            3645  non-idle wait count
             550  non-idle wait time
              52  opened cursors cumulative
               1  opened cursors current
            3495  physical read total IO requests
               1  pinned cursors current
             400  recursive calls
              13  recursive cpu usage
         1461632  session logical reads
             531  user I/O wait time
               6  user calls
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sazi

    2018/06/02 22:30

    手順は、①[環境準備]→[実行]、②[環境準備]→[統計情報取得]→[実行]だと思いますが、②ではcreate tableから行っていますか?

    キャンセル

  • ametyan

    2018/06/02 23:15

    はい、DROP TABLE JOB_MASTER PURGE; コマンドを使用してテーブルを削除してから再作成しています。

    キャンセル

回答 1

checkベストアンサー

+1

実行計画を見るとINDEX RANGE SCAN → TABLE ACCESS FULLとなっていますから、この部分で遅くなっているのは明らかです。

以下でインデックス情報を取得するようにすると改善されないでしょうか。

EXECUTE DBMS_STATS.GATHER_TABLE_STATS('SYS', 'JOB_MASTER', 'FOR ALL INDEXED');

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/02 23:52

    ご回答ありがとうございます。
    EXECUTE DBMS_STATS.GATHER_TABLE_STATS('SYS', 'JOB_MASTER', method_opt => 'FOR ALL INDEXES');
    を使用して実行計画取得したところ、コストがだいぶ下がりました。
    勉強になりました。

    353,216行削除されました。
    Plan hash value: 3620915039

    ---------------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    ---------------------------------------------------------------------------------
    | 0 | DELETE STATEMENT | | 50000 | 878K| 61 (0)| 00:00:01 |
    | 1 | DELETE | JOB_MASTER | | | | |
    |* 2 | INDEX RANGE SCAN| SYS_C008257 | 50000 | 878K| 61 (0)| 00:00:01 |
    ---------------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    2 - access("NAME_ID"<='NN453214')

    Statistics
    -----------------------------------------------------------
    592 CPU used by this session
    593 CPU used when call started
    1159 DB time
    353216 HSC Heap Segment Block Changes
    1 IMU Flushes
    14 SQL*Net roundtrips to/from client
    187 buffer is not pinned count
    383 bytes received via SQL*Net from client
    23717 bytes sent via SQL*Net to client
    51 calls to get snapshot scn: kcmgss
    25 calls to kcmgas
    39 calls to kcmgcs
    92954624 cell physical IO interconnect bytes
    279 change write time
    1885 cleanout - number of ktugct calls
    1885 cleanouts only - consistent read gets
    6 cluster key scan block gets
    5 cluster key scans
    1885 commit txn count during cleanout
    4357 consistent gets
    1904 consistent gets - examination
    4357 consistent gets from cache
    134 consistent gets from cache (fastpath)
    1 cursor authentications
    740783 db block changes
    389608 db block gets
    389608 db block gets from cache
    6089 db block gets from cache (fastpath)
    17066 dirty buffers inspected
    92 enqueue releases
    94 enqueue requests
    50 execute count
    5569417 file io wait time
    17946 free buffer inspected
    17885 free buffer requested
    3 hot buffers moved to head of LRU
    1885 immediate (CR) block cleanout applications
    8 immediate (CURRENT) block cleanout applications
    7 index fetch by key
    45 index scans kdiixs1
    255 messages sent
    490 no work - consistent read gets
    8427 non-idle wait count
    576 non-idle wait time
    50 opened cursors cumulative
    1 opened cursors current
    1 parse count (hard)
    50 parse count (total)
    1 parse time elapsed
    8453 physical read IO requests
    80150528 physical read bytes
    8453 physical read total IO requests
    80150528 physical read total bytes
    9784 physical reads
    8221 physical reads cache
    1563 physical reads direct
    1563 physical reads direct temporary tablespace
    61 physical write IO requests
    12804096 physical write bytes
    61 physical write total IO requests
    12804096 physical write total bytes
    49 physical write total multi block requests
    1563 physical writes
    1563 physical writes direct
    1563 physical writes direct temporary tablespace
    1563 physical writes non checkpoint
    53 pinned buffers inspected
    758 prefetched blocks aged out before use
    414 recursive calls
    2 recursive cpu usage
    5 redo buffer allocation retries
    363524 redo entries
    6 redo log space requests
    5 redo log space wait time
    1 redo ordering marks
    128038788 redo size
    1 session cursor cache count
    38 session cursor cache hits
    393965 session logical reads
    40 shared hash latch upgrades - no wait
    1 sorts (disk)
    7 sorts (memory)
    353854 sorts (rows)
    2 switch current to new buffer
    44 table fetch by rowid
    77044196 undo change vector size
    568 user I/O wait time
    15 user calls
    22 write clones created in foreground

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • SQL

    2176questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • Oracle

    560questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。