クエリパフォーマンスの向上
〜Update statistics〜
0.更新履歴
- 2001.11.06 新規作成
1.はじめに
このドキュメントでは,Sybase ASE11.9.2にて,統計情報の更新を行い,アクセスパスの改善を行う方法について説明する.
2.統計値の管理の必要性
インデックスが未設定のフィールドに対して,統計情報を追加すると,クエリパフォーマンスの向上が期待できる.
Sybaseのオプティマイザは,統計値を元に,テーブルやインデックスのクエリのコストを見積もる.
しかし,統計値が正確でない(古いまま等)であると,正確なコストが見積もれない.
よって,適切なタイミングで統計情報をい更新する.
3.更新のタイミングについて
統計値の更新は,クエリ中に更新されるもの,インデックス作成,update statistics実行時のみ更新されるものがある.
マニュアルによると,インデックスのキー分布に変更があったとき等となっているが,1週間に1回とか,定期的に行ったほうが良いようである.
また,Sybaseのサポートに連絡すると,統計値の更新(update statistics)を最後に行ったのはいつ?みたいな質問が出るそうである.
4.統計値の更新について注意
統計値の更新には,以下のような処理負荷がかかる.
- インデックススキャン
- プロシージャを実行する
- 共有ロック
などの処理が行われるため,処理負荷の高い時間帯を避ける.
5.文法
統計情報を更新するには,update statisticsコマンドを使用する.
文法と効果は以下のとおりである.
コマンド | 説明 |
---|---|
update statistics | 統計がない場合は統計を作成し,統計がある場合は新しく統計を作成する. |
update statistics テーブル名 | テーブル内にある各インデックスの統計を更新する. |
update statistics テーブル名 インデックス名 | インデックスの全カラムの統計値を更新する. |
update statistics テーブル名(フィールド名) | 指定されたフィールド分の統計値を更新. |
update statistics テーブル名(フィールド名1,フィールド名2) | セット内の順番に複合インデックスの統計値を更新. |
update index statistics テーブル名 | テーブル上にある全インデックスのカラムの統計値の更新. |
update index statistics テーブル名,インデックス名 | このインデックスの全カラムの統計. |
update all statistics テーブル名 | テーブルの全カラムの統計. |
6.統計情報を更新するカラムについて
Sybaseのオプティマイザでは,where句やhaving句で指定されたフィールドの統計値を利用して最適なアクセスパスを考え出す.
それらのフィールドにインデックスを設定していればいいのではないか? とおもわれるが,インデックスをつけると,大量更新が行われるような表の場合,インデックスの管理(更新)処理のコストが必要で,逆にパフォーマンスのボトルネックになることがあるらしい.
よって,1つの方法として,次のようなパターンによって改善する事が考えられる.
- where句やhaving句で指定するにもかかわらず,インデックスを指定しないでおく.
- それらのフィールドには,update statisticsによって統計情報を更新しておく.