メメメモモ

プログラミング、筋トレ、ゲーム、etc

Teng::Schema::Loaderが遅くなってくる件

Teng::Schema::Loaderは、動的にDBのテーブル情報を読み込んでスキーマ設定を行ってくれるので楽なのですが、テーブルが多くなってきたり、データがたくさんあるテーブルがあったりすると、この解析がとても遅くなってきます。
実際の解析は、DBIx::Inspectorが行っているのですが。

Devel::KYTProfで確認してみると、割と時間がかかっていることが分かりました。
一つのテーブルに数十ミリ秒〜数百ミリ秒かかっていて、テーブルが数十個あったりすると解析だけでも数秒かかってしまいます。
数千万単位のデータがあるテーブル存在していると、そのテーブルだけでも何秒もかかってきます。
特に"SHOW KEYS FROM `table_name`"というクエリが重くなるようです。


Webアプリでしたら、以下のように永続化すれば一回で済みますね。

our $TENG;
sub teng {
   $TENG ||= do {

        .....

        Teng::Schema::Loader->load(
            dbh => $dbh,
            namespace => 'MyDB::Schema',
        );
   };
}

しかし、cronで実行するバッチプログラムでWebアプリのModelの部分を共用している場合、
実行されるたびにスキーマ解析が走ってしまうことがあります。
頻繁に実行されるcron設定だと、DBにも割と負荷をかけてしまいます。


ひとまずの解決策として、Schemaを手動で宣言して、Teng::Schema::Loaderを使わないということです。
しかし、今更数十もあるテーブルを一個一個手で書いていくのも面倒くさいので、自動生成します。
Teng::Schema::Dumperというのが用意されているので、これを使えば簡単に出来ます。

use  Teng::Schema::Dumper;
print Teng::Schema::Dumper->dump(
    namespace => 'MyApp::DB',
    dbh            => $dbh,
);

ってことで、これでひとまず解決。
もっとスマートな方法がありそうだけれど。


ただ、自分の環境だとまだ問題があります。
そのことについてはまた対応した時に。