テンポラリデータベースのクエリが遅い場合の対応
テンポラリデータベースのクエリが遅い場合の、パフォーマンスチューニングの方法について説明します。
手順
クエリが遅い場合は、そのボトルネックを調べることが重要です。1つの方法としてクエリがどのように解釈されて実行されるのか(=実行計画)を確認します。実行計画は次のいずれかの方法で確認できます。
スクリプト内で取得
- クエリが遅い「検索系SQL実行」の直前に2つのアイコンを挿入します。1つ目は既存の「検索系SQL実行」アイコンをコピーし、そのクエリの先頭にEXPLAIN ANALYZEという文言を追加します。
- 2つ目に「CSVファイル書き込み」のアイコンを配置し、次のように設定します。「ファイル」欄は下記のとおりでなくてもかまいません。また「列一覧」には何も追加しません。
- 1つ目のアイコンと2つ目のアイコンの間を、プロセスフロー&データフローで結合します。
- スクリプトを実行すると、2.で指定した「ファイル」に実行計画が出力されます。
「データベース設定」ツールを利用
- 連携サーバー管理>(対象のサーバー) と進み、[データベース設定]をクリックします。
- 左側のパネルから「TemporaryDatabase」を選択し、ユーザ名とパスワードを入力しログインします。
- 画面上部右にある「SQL」をクリックします。
- 遅いクエリの先頭にEXPLAIN ANALYZEという文言を追加して、[実行する]を押下します。実行計画が表示されます。
特殊事例
テンポラリデータベースに対して、大量のレコードの挿入・削除を繰り返す場合、データベースエンジンが実行計画を作成する際に参考にする統計情報が正しくない場合があります。統計情報はバックエンドで自動的に更新されますが、レコードがほとんどない状態で作成された統計情報を使ってしまうと、レコード数が多い場合には著しく遅くなることがあります。弊社の事例では150倍以上遅くなったケースがあります。
このような使いかたをされる場合には、大量のデータを挿入した後、強制的に統計情報を更新することをお勧めします。統計情報の更新は「更新系SQL実行」アイコンに次のように設定することで実現できます。この例では、accountというテーブルに対して強制的に統計情報を更新しています。
ディスクアクセスが原因でクエリが遅いと思われる場合
実行計画に次のような文言が現れる場合があります。
Sort Method: external sort Disk: 10240kB
注目すべ基点はDiskとなっている部分です。これはソート処理がメモリ上で実行できず、ディスクを使ってソートを実行していることを意味しています。Diskはメモリに対して低速なため、この結果、クエリのパフォーマンスは著しく悪化します。メモリ上でソート処理されている場合は次のようになります。
Sort Method: quicksort Memory: 512kB
ディスクソートが発生している場合は実行計画を添付してサポートにお問い合わせください。連携サーバーのアップグレード等により解決する方法をご案内させていただきます。