実践パフォーマンスチューニング
オプティマイザ活用編
日本オラクル株式会社
Agenda
•
オプティマイザとは
•
コストベース・オプティマイザでの運用管理
・SQL Serverからの移行アセスメント
・MySQLからの移行相談
・PostgreSQLからの移行相談
・Accessからの移行アセスメント
・Oracle Database バージョンアップ支援
・Oracle Developer/2000 Webアップグレード相談
・パフォーマンス・クリニック
・Oracle Database 構成相談
・Oracle Database 高可用性診断
・システム連携アセスメント
・システムセキュリティ診断
・簡易業務診断
・メインフレーム資産活用
SQL の実行計画とは?
•
SQL を実行するには、多数のステップが必要
•
データベースからデータを物理的に取り出すステップ
•
ユーザーが発行する文に返すデータ行の準備ステップ
•
『実行計画』:
文を実行するためにOracle が使用する
ステップの組み合せ
Oracle Database
取り出し
メモリ
ディスク
結果
実行計画の例
•
従業員表(EMP 表)と部門表(DEPT 表)から、各部門ごと
の従業員リストを作成するSQL の実行計画
SQL> set autotrace on
SQL> select d.dname,e.empno,e.ename,e.job
from emp e,dept d
where e.deptno=d.deptno;
Execution Plan
---0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=14 Bytes=392)
1 0
HASH JOIN
(Cost=5 Card=14 Bytes=392)
2 1
TABLE ACCESS (FULL) OF 'DEPT'
(Cost=2 Card=4 Bytes=44)
3 1
TABLE ACCESS (FULL) OF 'EMP'
(Cost=2 Card=14 Bytes=238)
結合方法
同じ表と索引でも、データの状況(返すべきデータが表に存在する割合など)
によっては、全表走査/索引走査 した方が速い
索引Key1
.
.
.
Row1
Row2
Row3
.
.
.
Row4
索引Key2
索引Key3
索引Key4
hit
hit
hit
※索引走査はSingle Block Read であり、1Block ずつの読み込み処理
全表走査はMulti Block Read であり、db_file_multiblock_read_count パラメータ個ずつの一括読み込み
索引走査 (INDEX SCAN)
全表走査 (FULL SCAN)
パターンA
パターンB
索引
表
データの状況により最適な実行計画は違う
hit
Row1
Row2
Row3
.
.
.
Row4
表
全表走査
で実行した方が
速い時もある
•
問合せの結果を生成する最も効率的な方法(物理的な
アクセス手順)を決定し実行計画を作成
•
2種類のオプティマイザ
- 索引を利用するか
- 全表スキャンを実行するか
- どの結合方法を選択するか
- どの順番で結合するか etc.
オプティマイザの役割
RBO:使用可能なアクセスパスを順序づける
ランキングに基づいて実行計画を作成
CBO:統計情報に基づきコストを見積もり、
最もコストの低い実行計画を作成
パス1:(索引検索)IND_ENAMEを使用した単一列索引検索
パス2:(索引検索)IND_SALを使用した範囲検索
パス3:(全表スキャン)索引を使用しないアクセスパス
Emp表へのすべてのアクセスパスの洗い出し
アクセスパスのランク付け
SELECT empno FROM scott.emp
WHERE ename = 'BLAKE' AND sal > 2000;
EMP表の索引名
索引種類
対象列
PK_EMP
主キー
empno
IND_ENAME
非一意索引
ename
IND_SAL
非一意索引
sal
例)
RBOのルールのアクセスパス選択動作例
パス1:IND_ENAMEを使用した単一列索引検索
<ランク9>
パス2:IND_SALを使用した範囲検索
<ランク11>
パス3:全表スキャン
<ランク15>
アクセスパスのランク付け
IND_ENAMEを使用した単一列索引検索の採用
一番ランクの高い
<ランク9>
を採用
実行計画の決定
RBOのルールのアクセスパス
選択動作例(2)
1 ROWIDによる単一行
2 クラスタ結合による単一行
3 一意/主キーをもつハッシュ・
クラスタ・キーによる単一行
4 一意/主キーによる単一行
5 クラスタ結合
6 ハッシュ・クラスタ・キー
7 索引付きのクラスタ・キー
8 複合索引
9 単一列索引
10 索引列の境界付きの範囲検索
11 索引列の境界なしの範囲検索
12 ソート/マージ結合
13 索引付きの列のMAXまたはMIN
14 索引付きの列のORDER BY
15 全表スキャン
•
SQL文の内容(構文)だけで、実行計画が決まる。データの
内容は見ていない
•
OLTPタイプの処理を最適化するように設計されている
•
データの中身により、RBOよりも高速なパスが存在する
•
表の数が多くなると、最適なSQLの作成コストが増加
•
直感的でアドホックな検索は向かない
RBOの問題点
検索対象が多い場合も、インデックススキャンをしてしまう
索引Key1
.
.
.
Row1
Row2
Row3
.
.
.
Row4
索引Key2
索引Key3
索引Key4
Row1
Row2
Row3
.
.
.
Row4
※索引走査はSingle Block Readであり、1Blockずつの読み込み処理
全表走査はMulti Block Readであり、db_file_multiblock_read_countパラメータ個ずつの一括読み込み
索引走査 (INDEX SCAN)
全表走査 (FULL SCAN)
ランク9
ランク15
索引
表
表
本来は全表走査
で実行すべき!
コストベース・オプティマイザのメリット
データの変動
データの変動
ルールベース・オプティマイザ
コストベース・オプティマイザ
初期
性能
レスポンス
初期
性能
レスポンス
データの変動
に伴う性能劣化
性能劣化が顕著になり
SQLチューニングが必要
実行計画A
実行計画B
データの変動
に伴う性能劣化
データの変動に伴い、
性能が劣化する可能性が存在する
データの変動を考慮して、
最適な実行計画が使用されるよう
実行計画が自動で変化する
2つのオプティマイザ比較
ルールベース・
オプティマイザ (RBO)
コストベース・
オプティマイザ (CBO)
使用可能なアクセスパスを順
序づけるランキングに基づい
て実行計画を作成
統計情報に基づきコストを見
積もり、
最もコストの低い
実行
計画を作成
概要
• 新機能を使える
• OLTP、DSS 共に有効
• データの偏りや量に基づい
て最適な実行計画を作成
特徴
備考
• 新機能には対応しない
• OLTP 向き
• データの偏りや量は無視し
て実行計画を作成
• Oracle10g 以降は
サポートされない
• 統計情報の取得が必要
Agenda
•
オプティマイザとは
•
コストベース・オプティマイザでの運用管理
・SQL Serverからの移行アセスメント
・MySQLからの移行相談
・PostgreSQLからの移行相談
・Accessからの移行アセスメント
・Oracle Database バージョンアップ支援
・Oracle Developer/2000 Webアップグレード相談
・パフォーマンス・クリニック
・Oracle Database 構成相談
・Oracle Database 高可用性診断
・システム連携アセスメント
・システムセキュリティ診断
・簡易業務診断
・メインフレーム資産活用
無償技術サービスOracle
Direct
Concierge
コストベース・オプティマイザと統計情報
コストベース・オプィテマイザは
統計情報
と
初期化パラメータ
の
情報を利用してアクセスコストを見積もり、実行計画を作成する
初期化パラメータ:
DB_FILE_MULTIBLOCK_READ_COUNT など
統計情報:表の行数、索引の大きさ、など
統計情報を適切に収集することが重要
• DBMS_STATSパッケージ
を利用(Oracle 8.1以降)
例) 表ごとの統計を収集
例) スキーマ内のすべてのオブジェクトの統計を収集
例)データベース内のすべてのオブジェクトの統計を収集
•
ANALYZEコマンド
全行の統計情報を取得
ANALYZE TABLE 表名COMPUTE STATISTICS;
EXECUTE DBMS_STATS.GATHER_
TABLE
_STATS(‘SCOTT’,’EMP’);
EXECUTE DBMS_STATS.GATHER_
SCHEMA
_STATS(‘SCOTT’);
EXECUTE DBMS_STATS.GATHER_
DATABASE
_STATS();
コストベース・オプティマイザの注意点
•
原因
→統計情報が適切に取得されていない
•
データが大幅に更新され、取得した
統計情報が古くなっている
•
適切な精度(サンプルサイズ)で
収集されていない
etc
統計収集後、SQL 実行計画が変化し、性能が劣化した!
データの変動
初期
性能
レスポンス
実行計画A
実行計画B
データの変動
に伴う性能劣化
②
性能劣化
自動オプティマイザ統計収集
•
Oracle 10g からは、オプティマイザが適切な実行計画を
作成するのに必要な
統計情報を自動で取得
•
初期化パラメータstatistics_level がTYPICAL(デフォルト)または、
ALL
•
統計情報は、平日の夜間と週末に自動収集
•
DBMS_STATS パッケージにおいてoptionsに‘GATHER AUTO’
を指定するのと同様
・統計情報をまだ収集していないオブジェクト
・10% 以上データが更新されたオブジェクト
11gからの自動オプティマイザ統計収集
自動メンテナンスタスクが対応するデフォルトのウィンドウ:
MONDAY_WINDOW から SUNDAY_WINDOWまで
-月曜日~金曜日 それぞれの日に22時から翌2時までウィンドウがオープン
-土曜日・日曜日はAM6時から20時間(翌2時まで)オープン
自動メンテナンスタスク
-GATHER_STATS_JOBの内容が変更
-自動統計収集はデフォルトで有効。
10g:自動統計収集の無効化 スケジューラーからGATHER_STATS_JOB をDISABLE BEGIN DBMS_SCHEDULER.DISABLE('GATHER_ STATS_JOB'); END; / 11g:自動統計収集の無効化 自動メンテナンスタスクのうち、オプティマイザ統計の収集をDISABLE BEGIN DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'auto optimizer stats collection', operation => NULL, window_name => NULL); END; /