テーブル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;
アクセス時間が異常にかかって悩む場合は
インデックスを作成するか
統計情報を作成するかを試すのも一つの手かもしれません