1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

統計情報に振り回された話

Posted at

テーブルAからテーブルBに移送していく中で
一度のバッチ処理の中で移送されたAからさらに別のテーブルのデータを作る処理があり、
A1とA2、B1のデータからA3を作成する
といった具合に面倒くさい処理がありまして、、、

全ての移送処理はテーブルを空にして
データを移送、旧スキーマの統計情報を作成
という流れで移送されていました。

バッチ処理全体の最後のテーブル移送の処理の統計情報作成に
異常なまでの時間がかかっていたため
これは変だぞ?と思い調査を始めました。

初回の実行では約6hかかるのですが、
二回目以降の再実行だと5分で終わるため

「あ~これは新規で移送しているAのテーブルを何回も繰り返し見るせいでは??」

という判断に。

試しにAの移送時にAの統計情報を作成する処理をはさむことにしました。
先に統計情報を作成することで、
統計情報がない状態でテーブルにアクセスする場合よりも
アクセス速度の改善が見られました。

今回の私の事象の場合6h→4m

以下、統計情報取得用のSQLです

/*
諸々の移送処理関連のSQLは省略
*/

dbms_stats.gather_table_stats(
    user,REC.TABLE_NAME,cascade => true)

PROCEDURE XX IS
    BEGIN
        DECLARE
            CURSOR TAB IS
                SELECT TABLENAME
                    FROM USER_TABLES
                WHERE TABLE_NAME = 'OO'
                AND TEMPORARY = 'N'

            BEGIN
                FOR REC IN TAB LOOP
                    dbms_stats,gather_table_stats(
                    user,REC.TABLE_NAME,cascade => true);
                END LOOP;;
            END;
    END;

アクセス時間が異常にかかって悩む場合は
インデックスを作成するか
統計情報を作成するかを試すのも一つの手かもしれません

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?