oracle direct seminar...yes no yes no no yes no...

78
<Insert Picture Here> Oracle Direct Seminar オラクルコンサルタントが語るSQLチューニングの真髄 - 解決編Part1+2 - 日本オラクル株式会社

Upload: others

Post on 19-Jun-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

<Insert Picture Here>

Oracle Direct Seminar

オラクルコンサルタントが語るSQLチューニングの真髄- 解決編Part1+2 -

日本オラクル株式会社

Page 2: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 2

• 目的とゴール• SQLパフォーマンス問題の原因

• SQLパフォーマンス問題解決へのアプローチ• 定型的なSQLチューニング

• 非定型的なSQLチューニング

• 非定型的なSQLチューニング• データアクセス方法

• 表結合方法

• 表結合順序

• アプローチのポイント総ざらい

• まとめ

• Appendix 付録

アジェンダ

・SQL Serverからの移行アセスメント・MySQLからの移行相談

・PostgreSQLからの移行相談・Accessからの移行アセスメント

・Oracle Database バージョンアップ支援・Oracle Developer/2000 Webアップグレード相談

・パフォーマンス・クリニック・Oracle Database 構成相談

・Oracle Database 高可用性診断・システム連携アセスメント・システムセキュリティ診断

・簡易業務診断

無償技術サービスOracle Direct Concierge

http://www.oracle.com/lang/jp/direct/services.html

Page 3: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 3

<Insert Picture Here>

目的とゴール

Page 4: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 4

目的とゴール

今回の目的

本セミナーでは、以下のスキルを習得することを目的としています。

• SQLパフォーマンス問題に対し、表面的なチューニングだけではなくその裏に潜

む真の問題を見つけて解決するスキル

• システム全体で発生するSQLパフォーマンス問題を減らすスキル

• 最終的にはSQLパフォーマンス問題を予防する仕組みを実現するスキル

今回のゴール

• SQLパフォーマンス問題が発生する理由を理解する

• SQLパフォーマンス問題へ対処方法を理解・習得する

Page 5: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 5

<Insert Picture Here>

SQLパフォーマンス問題の原因

Page 6: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 6

コンサルタントのチューニング・アプローチ

アーキテクチャを意識した

SQLチューニング

定型的な

SQLチューニング

非定形的な

SQLチューニング

21 3

問題発生の原因と理由の考察現場のパフォーマンス問題

システムのパフォーマンス問題のほとんどがSQL

パフォーマンス問題に帰着する

SQLパフォーマンス問題が減らない

SQLパフォーマンス問題の解決に時間がかかる

何をどのように調査すればよいのかわからない

言語的特徴に起因する理由がある

• 記述に対する柔軟性が高い

• 処理ロジックを意識させないコーディングができる

• 同一の処理内容に対して、複数の記述方法が可能

• 処理方法はデータベースに任されている

開発時の状況や意識に及ぶ理由がある

• 正しい結果が返ることには気にしても、処理の効率化やデータベース内での処理を意識した開発に気が回らない

現場の声・現状 原因・理由

Page 7: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 7

チューニング・アプローチ

定型的なSQLチューニング

非定型的なSQLチューニング

アーキテクチャを意識したSQLチューニング

SQLコーディングルールによるSQL文の確認

SQL文の記述方法が柔軟でも、パフォーマンス問題を発生させないようにするためには、記述方法にある程度守るべきルールが存在する。

SQL文の実行状況、処理状況をアーキテクチャも含めて確認

定型的なチューニング、非定型的なチューニングを実施しても改善しない場合は、Oracle

アーキテクチャやアプリケーション・アーキテクチャを意識して考察する必要がある。

SQLがどのように処理しているのかを意識しながら、実行計画の確認

定型的な解があるわけではない、頭で考える必要のあるSQLチューニング。

問題発生の原因と理由の考察SQLパフォーマンス問題へのアプローチ

Page 8: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 8

<Insert Picture Here>

定型的なSQLチューニング

Page 9: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 9

予防 チューニング

SQLパフォーマンス問題解決へのアプローチ定型的なSQLチューニング

問題がおきたら最低限これだけはチェックする

最低限これだけは守ってコーディングする

「定型的なSQLチューニング」 =「最低限のSQLコーディング・ルール」

• 柔軟な言語だからこそ、守るべきルールが存在する

• 大きく4つのカテゴリに分かれる• アーキテクチャに伴う性能問題を避けるためのルール

• 使用方法やノウハウを元に性能問題を避けるためのルール

• 可読性や管理性を高めるためのルール

• 運用ポリシーを考慮したルール

• ルールを活用するにはポイントがある

• 開発者にも直観的にわかりやすいものにする

• ルールが必要となる理由を明確にし、指針、注意点、例なども加える

• プログラムレビューと同様にSQLコーディングもレビュー(チェックシートでチェック)

Page 10: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 10

SQLコーディングルールのチェックシート例

アスタリスク「*」が使用されていないか?

WHERE句

1

列名は表別名を使用して修飾されているか?

・否定形条件(!=, ^=, <>, NOT)

・NULL条件

No. チェック内容

・計算

・関数

重要度 対応方法

SQL修正

SQL修正

SQL修正

管理用コメントが付与されているか?

1

SQLコーディングルール・チェックリスト

ヒント句を使用していないか?※1 1 R4 不要なものがある場合はSQL修正

1

2 SELECT句

不要な関数は除外されているか?

SQL修正(取得対象列を明示)

不要なものがある場合はSQL修正

3

1

1

1

1

1複合索引を使用する場合は先頭列が指定されているか?

・連結演算子

・中間一致/後方一致検索

索引の使用を想定している列に対して以下の処理が行われていないか?

1

1

1

HAVING句による絞込みをWHERE句に代替することを検討済みか? 2 検討、SQL修正

SQL修正

1

1

SQL修正

SQL修正

SQL修正

SQL修正

SQL修正

R1

R1

R1

R1

R2

R3

R2

R2

R1

R1

R1

R1

SQL修正

暗黙の型変換が使用されていないか? 2 SQL修正(明示的に型変換関数を記述)

R1

R1

バインド変数が使用されているか? 1

ルール

R3

コーディングスタイルの統一

SQL修正

    <重要度の定義>LV1…性能劣化に関わらず守るべき必須事項LV2…性能に影響するため守るべき必須事項LV3…要件に応じて検討すべき検討事項

    <ルールの定義>R1…アーキテクチャに伴う性能問題を避けるためのSQLコーディングルールR2…使用方法やノウハウをもとに性能問題を避けるためのSQLコーディングルールR3…可読性や管理性を高めるSQLコーディングルールR4…運用ポリシーを考慮したSQLコーディングルール

Page 11: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 11

<Insert Picture Here>

非定型的なSQLチューニング

Page 12: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 12

オプティマイザへのインプット情報は妥当か?

自身で実行計画を検討

オプティマイザが生成した実行計画は適切か?

パフォーマンスを確認し妥当であればチューニング完了

インプット情報を修正できるか?

NOYES

NOYES

NOYESNO

SQLパフォーマンス問題解決へのアプローチ非定型的なSQLチューニングの進め方

【STEP1】 CBOのインプット情報を考慮する

• CBOのインプット情報を把握する

• インプット情報の改善方法を整理する

【STEP2】 実行計画の妥当性を判断する

• 「実行計画」を分析する

• 「実行計画」が精査する

【STEP3】 SQLの最適化へのアプローチを考慮する

• SQL単体の最適化

• システム全体の最適化

Page 13: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 13

発行されたSQL文は複数の実行ステップを経て結果を返します

SQL文の実行に必要なステップを導き出すのが

「コストベース・オプティマイザ(CBO)」

CBOによって導き出された実行ステップの流れが

「実行計画」

SQL文発行 計画に基づいて

SQL文を実行

結果実行計画

コストベースオプティマイザ

SQLパフォーマンス問題解決へのアプローチSTEP1 オプティマイザと実行計画

Page 14: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 14

オプティマイザ

実行計画

⑤ ヒント句

①SQLテキスト

②オブジェクト構造

③初期化パラメータ

データの実態 ④統計情報

SQLパフォーマンス問題解決へのアプローチSTEP1 実行計画が作成されるまで

• CBOのインプット、アウトプット情報• 「実行計画」を作成するために必要な情報は何か

Page 15: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 15

SQLパフォーマンス問題解決へのアプローチSTEP1 オプティマイザへのインプット情報

• インプット情報の詳細、改善方法、注意点の一覧

インプット情報 説明 改善方法 注意点

①SQLテキスト • 実際に発行されるSQL

テキストそのものコーディング・ルールを遵守しているか確認し、ルールに従っていない箇所を修正

-

②オブジェクト構造 • 索引やテーブルの属性などのデータ構造を格納する情報

WHERE句条件に適した索引が作成されているかを確認し、あきらかに索引が不足している場合は索引構成を変更

• 同じ表を使用する他のSQLに影響することを考慮する

③初期化パラメータ • データベースの初期化パラメータの一部

• V$SYS_OPTIMIZER_

ENVで一覧可

環境に適した値に設定されているか確認し、必要に応じてパラメータ値を変更

• インスタンス・レベルで設定値を変更する場合、全てのSQL文に影響を与えるため注意が必要

• セッション・レベルで設定値を変更可能なパラメータもあるため状況に応じて使い分ける

④統計情報 • データディクショナリに格納された表統計、列統計、索引統計など(※)

統計情報を再収集または固定化 • 再収集によりSQLパフォーマン

スが悪化する可能性もあるため必ず実行計画や性能の確認する

※ 事前に統計収集されていない場合には、動的サンプリングや内部デフォルト値が使用される場合がある

Page 16: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 16

<Insert Picture Here>

非定型的なSQLチューニング

【STEP1】CBOのインプット情報を考慮する

• CBOのインプット情報を把握する

• インプット情報の改善方法を整理する

【STEP2】実行計画の妥当性を判断する

• 「実行計画」を分析する

• 「実行計画」が精査する

Page 17: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 17

【STEP2のポイント】

• CBOが出した「実行計画」が適切か判断する

• 「実行計画」の理解、分析を行う

オプティマイザへのインプット情報は妥当か?

自身で実行計画を検討

オプティマイザが生成した実行計画は適切か?

パフォーマンスを確認し妥当であればチューニング完了

インプット情報を修正できるか?

NOYES

NOYES

NOYESNO

SQLパフォーマンス問題解決へのアプローチ非定型的なSQLチューニング

Page 18: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 18

SQL> SELECT d.dname , e.empno , e.ename , e.job

FROM emp e , dept d

WHERE e.deptno = d.deptno;

順序 Execution Plan

---- ----------------------------------------------------------

4 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=14 Bytes=392)

3 1 HASH JOIN (Cost=5 Card=14 Bytes=392)

1 2 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=44)

2 3 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=238)

実行計画の読み方

• インデントで整形されたツリー構造になっている

• ツリー構造の深いオペレーションから実行される

• 同一のレベルであれば、上に表示されているものから

• 結合方法の次のレベルに結合対象の表が表示される(結合操作ありの場合)

Page 19: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 19

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=14 Bytes=392)

1 HASH JOIN (Cost=5 Card=14 Bytes=392)

2 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=44)

3 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=238)

表結合方法

データアクセス方法表結合順序

実行計画を判断するポイント

データアクセス方法

表結合方法

表結合順序

2つの表を結合するにはハッシュ結合が最適か?

EMP表へののアクセスはフルスキャンでよいか?

DEPT表を先に読むのは適切か?

Page 20: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 20

実行計画を判断するポイント

表結合方法

表結合順序

索引を利用して参照

表を直接参照

データアクセス方法

全表スキャン(TABLE ACCESS FULL)

索引のレンジスキャン(INDEX RANCE SCAN)

索引の一意スキャン(INDEX UNIQUE SCAN)

索引のフルスキャン(INDEX FULL SCAN)

索引の高速フルスキャン(INDEX FAST FULL SCAN)

ネステッドループ結合

索引のスキップスキャン(INDEX SKIP SCAN)

ハッシュ結合

ソートマージ結合

直積結合

判断のポイント 分岐の種類

EMP表から?DEPT表から?それとも・・

Page 21: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 21

• セレクティビティ(選択率) = 条件を適用した結果の行数 / 全体の行数

• 計算方法は、ヒストグラム(※)の有無により異なります

セレクティビティとカーディナリティセレクティビティとは

条件句 算出方法

等価条件 COL = ‘X’ 1 / NDV

Number of Distinct Value (列に含まれる値の種類)

データが一様に分布していると仮定するので等価条件のセレクティビティは1/NDVとして計算されます。

非等価条件 COL > ‘X’ (HIVAL-X+1)/(HIVAL-LOWVAL+1)

※ データの分布統計情報。ヒストグラムを取得している場合、CBOはヒストグラムを元にセレクティビティを算出します。

※SQL文にバインド変数が使用されている場合は、バインドピーク機能の有無とヒストグラムの有無でセレクティビティの算出方法が変わります。(詳細はAppendix。)

算出方法の例(ヒストグラムが存在しない場合)

SQLの条件(条件の組み合わせ)にヒットする行ソースの割合

Page 22: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 22

顧客ID 顧客名 地域 性別

000001 田中 隆二 関東 男性

000002 井上 みき 東北 女性

000003 工藤 朊子 関東 女性

000004 本井 美由紀 九州 女性

000005 日高 千尋 関東 女性

000006 齋藤 美佳 関東 女性

000007 若木 泉水 関東 女性

000008 佐々木 千枝 東北 女性

000009 立花 真由 関西 女性

000010 宮原 希美 関東 女性

例) SELECT * FROM customer WHERE 性別=‘男性’

性別列は、「男性」「女性」の2種類=NDVは2

SQLのセレクティビティは1/2として計算されます

実際のデータでは男性の比率が10%だったとしても

50%の割合で条件にヒットすると予測を立てて実行計画を算出します

セレクティビティとカーディナリティセレクティビティの計算例

Page 23: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 23

例)SELECT * FROM customer WHERE 性別=‘男性’

1万行の表セレクティビティは1/2

1万×1/2=5000行

セレクティビティとカーディナリティカーディナリティとは

行ソースから戻される行の予測数

• カーディナリティ = 表の行数 × セレクティビティ

顧客ID 顧客名 地域 性別

000001 田中 隆二 関東 男性

000002 井上 みき 東北 女性

000003 工藤 朊子 関東 女性

000004 本井 美由紀 九州 女性

000005 日高 千尋 関東 女性

010000 木村 あかね 関東 女性

Page 24: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 24

索引を利用して参照

表を直接参照

データアクセス方法

全表スキャン(TABLE ACCESS FULL)

索引のレンジスキャン(INDEX RANCE SCAN)

索引の一意スキャン(INDEX UNIQUE SCAN)

索引のフルスキャン(INDEX FULL SCAN)

索引の高速フルスキャン(INDEX FAST FULL SCAN)

索引のスキップスキャン(INDEX SKIP SCAN)

• データアクセス方法は大きく2つあります

データアクセス方法データアクセス方法の種類

Page 25: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 25

• 全表スキャン(TABLE ACCESS FULL)• HWM(High Water Mark)までの全ブロックを読み込みます

• 表がパーティション化されている場合、一部のツールではTABLE ACCESS FULLとなっていても表全体にアクセスするとは限らず、特定のパーティションのみにアクセスしている可能性があります

データアクセス方法表を直接参照

AP サーバープロセス

PGA

DBバッファキャッシュ

HWM

索引を利用して参照

データアクセス

方法

全表スキャン

索引のレンジスキャン

索引の一意スキャン

索引のフルスキャン

索引の高速フルスキャン

索引のスキップスキャン

表を直接参照

ポイント3:必ずHWMまでの読みが発生

ポイント2:複数ブロック読み込みでのI/O回数

ポイント1:キャッシュに残されない場合が多い

Page 26: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 26

データアクセス方法索引を利用して参照

• 索引のレンジスキャン

root

B1 B2

L11 L12 L13 L21 L22

INDEX RANGE SCAN

• キー値の範囲でリーフ・ブロックをスキャンして条件に該当する複数エントリを返します。

索引を利用して参照

データアクセス

方法

全表スキャン

索引のレンジスキャン

索引の一意スキャン

索引のフルスキャン

索引の高速フルスキャン

索引のスキップスキャン

表を直接参照

Page 27: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 27

• 索引の一意スキャン

root

B1 B2

L11 L12 L13 L21 L22

INDEX UNIQUE SCAN

• 条件に該当する1エントリを返します

• UNIQUE索引の列に対して、等価条件を使用している場合のみに出力されるオペレーションです。

索引を利用して参照

データアクセス

方法

全表スキャン

索引のレンジスキャン

索引の一意スキャン

索引のフルスキャン

索引の高速フルスキャン

索引のスキップスキャン

表を直接参照データアクセス方法索引を利用して参照

Page 28: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 28

• 索引のフルスキャン

root

B1 B2

L11 L12 L13 L21 L22

INDEX FULL SCAN

• リーフ・ブロックをフルスキャンして、条件に該当するエントリを返します。

• リンク順にスキャンするため、キー値でソートされた順にエントリを返します。

• 返された値がソートされているため、その後のソート処理を省略できる場合があります。

索引を利用して参照

データアクセス

方法

全表スキャン

索引のレンジスキャン

索引の一意スキャン

索引のフルスキャン

索引の高速フルスキャン

索引のスキップスキャン

表を直接参照データアクセス方法索引を利用して参照

Page 29: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 29

• 索引の高速フルスキャン

セグメント・ヘッダ

root

L11

B1

L21

B2

L22

INDEX FAST

FULL SCAN

• ツリー構造を意識せずに、セグメント・ヘッダから順にブロックをフルスキャンするため、返ってくる値はソートされていません。

• マルチ・ブロック・リードやパラレル実行を行うことができます。

索引を利用して参照

データアクセス

方法

全表スキャン

索引のレンジスキャン

索引の一意スキャン

索引のフルスキャン

索引の高速フルスキャン

索引のスキップスキャン

表を直接参照データアクセス方法索引を利用して参照

Page 30: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 30

root

B1 B2

L11 L12 L13 L21 L22

INDEX SKIP SCAN

• 索引のスキップスキャン

• 複合索引の第一列目に対する条件指定が無く、2列目以降の列に対して条件指定があった場合に採用され得る可能性があります。

• INDEX RANGE SCANと比較すると、効率が悪いオペレーションです。

索引を利用して参照

データアクセス

方法

全表スキャン

索引のレンジスキャン

索引の一意スキャン

索引のフルスキャン

索引の高速フルスキャン

索引のスキップスキャン

表を直接参照データアクセス方法索引を利用して参照

Page 31: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 31

索引を利用して参照

表を直接参照

データアクセス方法

全表スキャン(TABLE ACCESS FULL)

索引のレンジスキャン(INDEX RANCE SCAN)

索引の一意スキャン(INDEX UNIQUE SCAN)

索引のフルスキャン(INDEX FULL SCAN)

索引の高速フルスキャン(INDEX FAST FULL SCAN)

索引のスキップスキャン(INDEX SKIP SCAN)

• データアクセス方法は大きく2つありました

データアクセス方法データアクセス方法の種類

Page 32: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 32

【セレクティビティ】

• カーディナリティの生成に必要

• セレクティビティが低い場合

• 条件列に索引が定義されていると索引を使用してデータを絞り込む効果が高いため索引が使用されやすくなる

例)SELECT * FROM customer WHERE 性別=‘男性’ AND 顧客ID=‘000001’;

前提:顧客ID=‘000001’ のセレクティビティ : 1/10000性別=‘男性’のセレクティビティ : 0.5

顧客ID=1 の条件を使用して先にデータを絞り込むと効率的

顧客ID列に索引が定義されている場合には索引スキャンが選ばれる可能性が高い

顧客ID 顧客名 地域 性別

000001 田中 隆二 関東 男性

000002 井上 みき 東北 女性

000003 工藤 朊子 関東 女性

・ ・ ・ ・

010000 木村 あかね 関東 女性

【カーディナリティ】

• 結合やソートオペレーションの効率性を検討する際に使用

データアクセス方法判断例

Page 33: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 33

表結合方法表結合方法の種類

表結合方法

ネステッドループ結合

ハッシュ結合

ソートマージ結合

直積結合

• 表結合方法は4つ

Page 34: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 34

表結合方法ネステッドループ結合

• 動作概要:• 最初に外部表にアクセスする

• 外部表から戻された行数分、内部表にアクセスして条件に合致するデータを戻す

• ポイント:1. カーディナリティが小さい表を外部

表とする• 外部表のカーディナリティが内部表の参照回

数となる

• 実レコード件数ではなくカーディナリティが小さい表を外部表とする

2. 内部表のアクセス効率を上げる• 内部表の結合列に索引があると効率的

• 内部表の結合列に索引がないと、内部表の全件検索を繰り返すため効率が悪くなる場合がある

while {外部表から絞込条件に合致する1行を取得する1行もなければループから抜けるwhile {

内部表から絞込条件、結合条件に合致する1行を取得する取得した行を結果として返す1行もなければループから抜ける

}}

外部ループ

内部ループ

DEPTNO DNAME

10 OracleDirect

20 RESEARCH

30 Support

DEPTNO DNAME

20 RESEARCH

EMP

NO

DEPT

NO

1 10

2 20

3 20

4 30

5 30

外部表 内部表

表結合方法

ネステッドループ結合

ハッシュ結合

ソートマージ結合

直積結合

Page 35: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 35

表結合方法ネステッドループ結合

• 動作のステップ:1. DEPT表を外部表、 EMP表が内部表となる

2. DEPT表をフルスキャンし、条件(DNAME=‘RESEARCH’ )に合致する行をフェッチする

3. 1で取得する行数分4~5を繰り返す(ポイント1)

4. EMP表の索引EMP_IX2を索引レンジスキャンし(ポイント2)、フェッチした行と結合する行を特定する

5. EMP表にアクセスして特定した行を取得する

• 実行計画例:

表結合方法

ネステッドループ結合

ハッシュ結合

ソートマージ結合

直積結合

Page 36: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 36

表結合方法ハッシュ結合

• 動作概要:• 表1から抽出条件に合致する結果セットを返す

• 結果セットの結合キーをもとにハッシュ表をPGA内に作成する

• 表2から絞込条件に合致する結果セットを返す

• 結果セットの結合キーを順にハッシュし、ハッシュ表と照らし合わせて結合条件に該当する行を特定する

• ポイント:1. カーディナリティが小さい方を先に処理する

• PGA上に作成されるハッシュ表が小さくなるため、結合処理が効率的になる

2. 一時表領域へのI/Oが発生する可能性がある

• ハッシュ表がメモリ内に収まらない場合、一時表領域を使用するため、ディスクI/Oの発生により性能が劣化しやすい

• PGA_AGGREGATE_TARGET もしくはHASH_AREA_SIZEを考慮する

3. 等価条件でのみ使われる

• 結合条件が等価結合でない(範囲指定)場合、ハッシュ結合は使われない

4. アクセス方法は必ずフルスキャン

• ハッシュ結合の場合は、必ず表のフルスキャンもしくは索引のフルスキャンとなる

HASH表

結合キー 結合キー

PGA

HASH関数 HASH関数

表結合方法

ネステッドループ結合

ハッシュ結合

ソートマージ結合

直積結合

TEMP

ファイル

表1 表2

Page 37: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 37

表結合方法ハッシュ結合

• 実行計画例:

• 動作のステップ:1. DEPT表をフルスキャンし、絞込条件(DNAME=‘RESEARCH’ )に合致するデータを取り出す(ポ

イント4)

2. 結合キーの値をハッシュし、ハッシュ表の対応するパーティションに値を格納する

3. EMP表をフルスキャンする(ポイント4)

4. 結合キーの値をハッシュし、該当するパーティションに行があるか確認し、行がある場合には値を適切なパーティションに格納する

5. 結合した結果を返す

表結合方法

ネステッドループ結合

ハッシュ結合

ソートマージ結合

直積結合

Page 38: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 38

表結合方法ソートマージ結合

• 動作:• 表1の結果セットを結合列でPGA内でソートする

• 表2の結果セットを結合列でPGA内でソートする

• ソート処理はシリアルに実行されます

• ソート結果をPGA内でマージして結果を返します

• ポイント:1. 一時表領域へのI/Oが発生する可能性がある

• ソート処理がメモリ内に収まらない場合、一時表領域を使用するため、ディスクI/Oの発生により性能が劣化しやすい

• PGA_AGGREGATE_TARGET もしくはSORT_AREA_SIZEを考慮する

2. 表1は一定条件でソート処理が回避できる(表2のソートは回避できない)• 表1は、結合列に索引が定義されNOT NULL制約

が存在する場合、索引フルスキャンを実行することでソート処理を回避できる

• 表2は、ソートを行いながら結合を進めるため、ソート処理は回避できない

PGA

ソート

表1 表2

ソート

表結合方法

ネステッドループ結合

ハッシュ結合

ソートマージ結合

直積結合

TEMP

ファイル

Page 39: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 39

表結合方法ソートマージ結合

• 動作のステップ:1. DEPT表をフルスキャンする

2. DEPT表の結果セットを結合列(DEPTNO)でソートする

3. EMP表をフルスキャンする

4. EMP表の結果セットを結合列(DEPTNO)でソートしながら2の結果と結合する

• 実行計画例:

表結合方法

ネステッドループ結合

ハッシュ結合

ソートマージ結合

直積結合

Page 40: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 40

表結合方法直積結合

• 動作概要:• 結果セット1の全行と結果セット2の全行を

直積(掛け算)する

• ポイント:• 2つの行ソースに対する結合条件がない場

合に直積が選択される

• 結合条件にもれがないか確認する

結果セット1

直積演算

n件 m件

結果セット2

アクセス件数 ≒ n件 × m件

表結合方法

ネステッドループ結合

ハッシュ結合

ソートマージ結合

直積結合

※スター・スキーマ構造となっているDWHシステムでは有効な場合がある

Page 41: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 41

表結合方法直積結合

• 動作のステップ:1. DEPT表をフルスキャンする

2. EMP表をフルスキャンする

3. 2の結果セットをソートする

4. 2と4の結果をマージ

• 実行計画例:

表結合方法

ネステッドループ結合

ハッシュ結合

ソートマージ結合

直積結合

Page 42: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 42

表結合方法表結合方法の種類

表結合方法

ネステッドループ結合

ハッシュ結合

ソートマージ結合

直積結合

• 表結合方法は4つ

Page 43: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 43

表結合順序結合順のパターン

• 同時に3つ以上の表を結合することはできない

• 結合順序のパターンは表の数に依存する

表結合順序 EMP表から?DEPT表から?それとも・・

Page 44: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 44

表結合順序現状を分析する手順

① 表の結合関係をクリアにする• SQL文、索引定義情報、統計情報

• WHERE句に含まれている列

• 結合されている列同士の結合関係

• 推移律

• 選択率とカーディナリティ

② 結合順序のスタートポイントを見つける• どれくらい絞れるか

• 絞り込める表(スタートポイント)はどれか

Page 45: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 45

[SQL文]SELECT count(*)

FROM tab1 t1 , tab2 t2 , tab3 t3 , tab4 t4 , tab5 t5

WHERE t1.id = t2.idAND t1.id = t3.idAND t2.class = t5.classAND t3.class = t4.classAND t4.flag = 'Y'AND t5.num = TO_NUMBER(:b1)AND t4.code = TO_NUMBER(:b2)AND t1.start_date <= (TO_DATE(:b3, 'yyyymmdd') + 1)AND t1.end_date > TO_DATE(:b3, 'yyyymmdd')

[索引の定義]TABLE_NAME INDEX_NAME COLUMN_NAME KIND

----------- ----------- ------------------ ---------------TAB1 TAB1_P1 ID Primary Key

TAB1_U1 ID, END_DATE Unique Key

TAB2 TAB2_PK ID, CLASS, ZONE Primary KeyTAB2_I1 CLASS, IDTAB2_I2 ID

TAB3 TAB3_P1 ID, CLASS, DEPTH Primary KeyTAB3_I1 CLASS, ID

TAB4 TAB4_PK CODE Primary KeyTAB4_I1 CLASS, CODE

TAB5 TAB5_PK CLASS Primary KeyTAB5_U1 DATA, CLASS, NUM Unique KeyTAB5_I1 NUM, DATA

• SQL文、索引定義情報

表結合順序①表の結合関係をクリアにする

Page 46: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 46

• 統計情報

[SQL文]SELECT count(*)

FROM tab1 t1 , tab2 t2 , tab3 t3 , tab4 t4 , tab5 t5

WHERE t1.id = t2.idAND t1.id = t3.idAND t2.class = t5.classAND t3.class = t4.classAND t4.flag = 'Y'AND t5.num = TO_NUMBER(:b1)AND t4.code = TO_NUMBER(:b2)AND t1.start_date <= (TO_DATE(:b3, 'yyyymmdd') + 1)AND t1.end_date > TO_DATE(:b3, 'yyyymmdd')

[表の統計情報]OWNER TABLE_NAME COLUMN_NAME NUM_ROWS NUM_DISTINCT

------ ----------- ------------ --------- ------------SCOTT TAB1 ID 275 275SCOTT TAB1 START_DATE 275 5SCOTT TAB1 END_DATE 275 1

SCOTT TAB2 ID 282 273SCOTT TAB2 CLASS 282 17

SCOTT TAB3 ID 17442 274SCOTT TAB3 CLASS 17442 8210

SCOTT TAB4 CODE 834030 834030SCOTT TAB4 FLAG 834030 1SCOTT TAB4 CLASS 834030 834030

SCOTT TAB5 NUM 133 132SCOTT TAB5 CLASS 133 133

表結合順序①表の結合関係をクリアにする

Page 47: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 47

TAB5

NUM = :b1

CLASSTAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3TAB3

ID

CLASSTAB4

CODE = :b2

FLAG = ‘Y’

CLASS 列名 索引の使用できる列

• 登場するオブジェクトを抽出し、WHERE句の列を書き出す

表結合順序①表の結合関係をクリアにする

Page 48: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 48

TAB5

NUM = :b1

CLASSTAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3TAB3

ID

CLASSTAB4

CODE = :b2

FLAG = ‘Y’

CLASS 列名 索引の使用できる列

• 登場するオブジェクトを抽出し、WHERE句の列を書き出す

結合されている列

• 結合列を結ぶ

表結合順序①表の結合関係をクリアにする

Page 49: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 49

TAB5

NUM = :b1

CLASSTAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3TAB3

ID

CLASSTAB4

CODE = :b2

FLAG = ‘Y’

CLASS 列名 索引の使用できる列

• 登場するオブジェクトを抽出し、WHERE句の列を書き出す

結合されている列

• 結合列を結んでみる• A=BかつB=Cであれば、A=Cである論理条件を見つける

(推移律)

表結合順序①表の結合関係をクリアにする

Page 50: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 50

TAB5

NUM = :b1

CLASSTAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3TAB3

ID

CLASSTAB4

CODE = :b2

FLAG = ‘Y’

CLASS 列名 索引の使用できる列

• 登場するオブジェクトを抽出し、WHERE句の列を書き出す

結合されている列

• 結合列を結んでみる• A=BかつB=Cであれば、A=Cである論理条件を見つける

(推移律)

C:133/132=1

S:1/132

C:133/133=1

S:1/133

C:282/17=16.5

S:1/17

C:282/273=1

S:1/273

C:275/275=1

S:1/275

C:275/1=275

S:1/1

C:275/5=55

S:1/5C:17442/274=63.5

S:1/274

C:17442/8210=2

S:1/8210

C:83万/83万=1

S:1/83万

C:83万/83万=1

S:1/83万C:83万/1=83万S:1/1

C:カーディナリS:選択率

• カーディナリティとセレクティビティを整理する

表結合順序①表の結合関係をクリアにする

Page 51: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 51

表結合順序現状を分析する手順

① 表の結合関係をクリアにする• SQL文、索引定義情報、統計情報

• WHERE句に含まれている列

• 結合されている列同士の結合関係

• 推移律

• 選択率とカーディナリティ

② 結合順序のスタートポイントを見つける• どれくらい絞れるか

• 絞り込める表(スタートポイント)はどれか

Page 52: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 52

TAB5

NUM = :b1

CLASSTAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3TAB3

ID

CLASSTAB4

CODE = :b2

FLAG = ‘Y’

CLASS 列名 索引の使用できる列

• 登場するオブジェクトを抽出し、WHERE句の列を書き出す

結合されている列

• 結合列を結んでみる• A=BかつB=Cであれば、A=Cである論理条件を見つける

(推移律)

C:133/132=1

S:1/132

C:133/133=1

S:1/133

C:282/17=16.5

S:1/17

C:282/273=1

S:1/273

C:275/275=1

S:1/275

C:275/1=275

S:1/1

C:275/5=55

S:1/5C:17442/274=63.5

S:1/274

C:17442/8210=2

S:1/8210

C:83万/83万=1

S:1/83万

C:83万/83万=1

S:1/83万C:83万/1=83万S:1/1

C:カーディナリS:選択率

表結合順序②結合順序のスタートポイントを見つける

• どれくらい行が絞れるか考える

絞込みで0~275件

絞込みで1件

絞込みで1件

絞込めないので17442件

絞込めないので282件

Page 53: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 53

TAB5

NUM = :b1

CLASSTAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3TAB3

ID

CLASSTAB4

CODE = :b2

FLAG = ‘Y’

CLASS 列名 索引の使用できる列

• 登場するオブジェクトを抽出し、WHERE句の列を書き出す

結合されている列

• 結合列を結んでみる• A=BかつB=Cであれば、A=Cである論理条件を見つける

(推移律)

C:133/132=1

S:1/132

C:133/133=1

S:1/133

C:282/17=16.5

S:1/17

C:282/273=1

S:1/273

C:275/275=1

S:1/275

C:275/1=275

S:1/1

C:275/5=55

S:1/5C:17442/274=63.5

S:1/274

C:17442/8210=2

S:1/8210

C:83万/83万=1

S:1/83万

C:83万/83万=1

S:1/83万C:83万/1=83万S:1/1

C:カーディナリS:選択率

表結合順序②結合順序のスタートポイントを見つける

• どれくらい絞れるか

絞込みで0~275件

絞込みで1件

絞込みで1件

絞込めないので17442件

絞込めないので282件

• 絞り込める表(スタートポイント)の候補を出す

Start

Point

Start

Point

Start

Point

Page 54: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 54

現在の実行計画を把握する1つ目の結合

Execution Plan

---------------------------------------------------

SELECT STATEMENT GOAL: CHOOSE

SORT (AGGREGATE)

NESTED LOOPS

┣NESTED LOOPS

┃┣NESTED LOOPS

┃┃ ┣ NESTED LOOPS

┃┃ ┃┣TABLE ACCESS GOAL: ANALYZED (FULL) OF 'TAB1'

┃┃ ┃┗INDEX GOAL: ANALYZED (RANGE SCAN) OF 'TAB2_PK' (UNIQUE)

┃┃ ┗INDEX GOAL: ANALYZED (FULL SCAN) OF 'TAB3_I1' (NON-UNIQUE)

┃┗ TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'TAB4'

┃ INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'TAB4_PK' (UNIQUE)

┗TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'TAB5'

INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'TAB5_PK' (UNIQUE)

外部表になる行ソース 内部表になる行ソースフォーカスする処理

Page 55: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 55

TAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3

アクセス1回⇒絞込でX件ヒット

NLアクセス X回⇒X*1件ヒット

①Start

Point

現在の実行計画を把握する1つ目の結合

Page 56: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 56

Execution Plan

---------------------------------------------------

SELECT STATEMENT GOAL: CHOOSE

SORT (AGGREGATE)

NESTED LOOPS

┣NESTED LOOPS

┃┣NESTED LOOPS

┃┃ ┣ NESTED LOOPS

┃┃ ┃┣TABLE ACCESS GOAL: ANALYZED (FULL) OF 'TAB1'

┃┃ ┃┗INDEX GOAL: ANALYZED (RANGE SCAN) OF 'TAB2_PK' (UNIQUE)

┃┃ ┗INDEX GOAL: ANALYZED (FULL SCAN) OF 'TAB3_I1' (NON-UNIQUE)

┃┗ TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'TAB4'

┃ INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'TAB4_PK' (UNIQUE)

┗TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'TAB5'

INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'TAB5_PK' (UNIQUE)

外部表になる行ソース 内部表になる行ソースフォーカスする処理

現在の実行計画を把握する2つ目の結合

Page 57: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 57

TAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3

アクセス1回⇒絞込でX件ヒット

NLアクセス X回⇒X*1件ヒット

TAB3

ID

CLASS

NLアクセス X回⇒X*63.5件ヒット

Start

Point

現在の実行計画を把握する2つ目の結合

Page 58: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 58

外部表になる行ソース 内部表になる行ソースフォーカスする処理

現在の実行計画を把握する3つ目の結合

Execution Plan

---------------------------------------------------

SELECT STATEMENT GOAL: CHOOSE

SORT (AGGREGATE)

NESTED LOOPS

┣NESTED LOOPS

┃┣NESTED LOOPS

┃┃ ┣ NESTED LOOPS

┃┃ ┃┣TABLE ACCESS GOAL: ANALYZED (FULL) OF 'TAB1'

┃┃ ┃┗INDEX GOAL: ANALYZED (RANGE SCAN) OF 'TAB2_PK' (UNIQUE)

┃┃ ┗INDEX GOAL: ANALYZED (FULL SCAN) OF 'TAB3_I1' (NON-UNIQUE)

┃┗ TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'TAB4'

┃ INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'TAB4_PK' (UNIQUE)

┗TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'TAB5'

INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'TAB5_PK' (UNIQUE)

Page 59: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 59

TAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3

アクセス1回⇒絞込でX件ヒット

NLアクセス X回⇒X*1件ヒット

TAB3

ID

CLASS

NLアクセス X回⇒X*63.5件ヒット

TAB4

CODE = :b2

FLAG = ‘Y’

CLASS

NL アクセスX*63.5回⇒絞込で2件ヒット

Start

Point

現在の実行計画を把握する3つ目の結合

Page 60: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 60

Execution Plan

---------------------------------------------------

SELECT STATEMENT GOAL: CHOOSE

SORT (AGGREGATE)

NESTED LOOPS

┣NESTED LOOPS

┃┣NESTED LOOPS

┃┃ ┣ NESTED LOOPS

┃┃ ┃┣TABLE ACCESS GOAL: ANALYZED (FULL) OF 'TAB1'

┃┃ ┃┗INDEX GOAL: ANALYZED (RANGE SCAN) OF 'TAB2_PK' (UNIQUE)

┃┃ ┗INDEX GOAL: ANALYZED (FULL SCAN) OF 'TAB3_I1' (NON-UNIQUE)

┃┗ TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'TAB4'

┃ INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'TAB4_PK' (UNIQUE)

┗TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'TAB5'

INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'TAB5_PK' (UNIQUE)

外部表になる行ソース 内部表になる行ソースフォーカスする処理

現在の実行計画を把握する4つ目の結合

Page 61: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 61

TAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3

アクセス1回⇒絞込でX件ヒット

NLアクセス X回⇒X*1件ヒット

TAB3

ID

CLASS

NLアクセス X回⇒X*63.5件ヒット

TAB4

CODE = :b2

FLAG = ‘Y’

CLASS

NL アクセスX*63.5回⇒絞込で2件ヒット

TAB5

NUM = :b1

CLASS

NL アクセス2回⇒絞込で1件ヒット

Start

Point

現在の実行計画を把握する4つ目の結合

Page 62: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 62

TAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3

現在の実行計画を分析する

アクセス1回⇒絞込でX件ヒット

NLアクセス X回⇒X*1件ヒット

TAB3

ID

CLASS

NLアクセス X回⇒X*63.5件ヒット

TAB4

CODE = :b2

FLAG = ‘Y’

CLASS

NL アクセスX*63.5回⇒絞込で2件ヒット

TAB5

NUM = :b1

CLASS

NL アクセス2回⇒絞込で1件ヒット

Start

Point

表 アクセス回数 カーディナリティ

TAB1 1回 X行

TAB2 X回 X×1行

TAB3 X回 X×63.5行

TAB4 X×63.5回 2行

TAB5 2回 1行

Page 63: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 63

現在の実行計画を分析する

TAB1

フルスキャンTAB2

索引レンジスキャン

ネステッド TAB3

索引フルスキャン

ネステッド TAB4

索引ユニーク

ネステッド TAB5

索引ユニーク

ネステッド

表 アクセス回数 カーディナリティ

TAB1 1回 X行

TAB2 X回 X×1行

TAB3 X回 X×63.5行

TAB4 X×63.5回 2行

TAB5 2回 1行

Page 64: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 64

TAB5

NUM = :b1

CLASSTAB2

ID

CLASS

TAB1

ID

START_DATE <= :b3+1

END_DATE > :b3TAB3

ID

CLASSTAB4

CODE = :b2

FLAG = ‘Y’

CLASS

NL アクセス2回⇒2*1件ヒット

NLアクセス2回⇒2*1件ヒット

NLアクセス 1回⇒1*2件ヒット

アクセス1回⇒絞込で1件ヒット

NL アクセス2回⇒絞込で1件ヒット

Start

Point

実行計画を検討する別のチューニング案

表 アクセス回数 カーディナリティ

TAB4 1回 1行

TAB3 1回 2行

TAB1 2回 2行

TAB2 2回 2行

TAB5 2回 1行

Page 65: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 65

TAB4

索引ユニークTAB3

索引フルスキャン

ネステッド TAB1

フルスキャン

ネステッド TAB2

索引レンジスキャン

ネステッド TAB5

索引ユニーク

ネステッド

表 アクセス回数 カーディナリティ

TAB4 1回 1行

TAB3 1回 2行

TAB1 2回 2行

TAB2 2回 2行

TAB5 2回 1行

実行計画を検討する別のチューニング案

Page 66: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 66

• それぞれの特性と考慮点から「検討」「検証」「判断」する• 適切な索引が作成されているか?

• 最適な索引が使用されているか?

• WHERE句条件が適切か(コーディング、条件指定)?

• 表のフルスキャンの方が効率的か(索引を使用しても10%以上の表データアクセスなど)?

• ネステッドループ結合で内部表のフルスキャンが発生していないか?

• カーディナリティの小さい表から結合されているか?

SQL単体の最適化

実行計画の妥当性最適化のアプローチ

SQLによるデータの取得を最小のブロックアクセスで行うことが原則です。しかしながら、SQL単体を最適化(レスポンス改善)するアプローチだけでは不十分です。

Page 67: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 67

• 実行計画の違いによる必要リソース(CPU,メモリなど)のバランスで判断• サーバ上でOracle以外のアプリケーションが動作し物理メモリが圧迫されている

→ハッシュ結合やソートマージ結合が同時に実行されて物理メモリが圧迫されないか

• CPU使用率が高い

→無駄なソート処理がないか、ネステッドループ結合によりCPU負荷が高くなっていないか

実行計画の妥当性最適化のアプローチ

SQLパフォーマンス問題を解決するにはSQL単体の最適化だけではなく、システム全体の最適化をふまえて判断することが重要である

システム全体の最適化

Page 68: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 68

<Insert Picture Here>

まとめ

Page 69: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 69

実行計画を判断するポイントのおさらい妥当性の判断

全パターンを検証するのは難しい

意識するのは

・SQL単体の最適化

・システム全体の最適化

表結合方法

表結合順序

索引を利用して参照

表を直接参照

データアクセス方法

全表スキャン(TABLE ACCESS FULL)

索引のレンジスキャン(INDEX RANCE SCAN)

索引の一意スキャン(INDEX UNIQUE SCAN)

索引のフルスキャン(INDEX FULL SCAN)

索引の高速フルスキャン(INDEX FAST FULL SCAN)

ネステッドループ結合

索引のスキップスキャン(INDEX SKIP SCAN)

ハッシュ結合

ソートマージ結合

直積結合

判断のポイント 分岐の種類

EMP表から?DEPT表から?それとも・・

Page 70: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 70

今回の目的

本セミナーでは、以下のスキルを習得することを目的としています。

• SQLパフォーマンス問題に対し、表面的なチューニングだけではなくその裏に潜

む真の問題を見つけて解決するスキル

• システム全体で発生するSQLパフォーマンス問題を減らすスキル

• 最終的にはSQLパフォーマンス問題を予防する仕組みを実現するスキル

今回のゴール

• SQLパフォーマンス問題が発生する理由を理解する

• SQLパフォーマンス問題へ対処方法を理解・習得する

今回のまとめ

Page 71: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 71

<Insert Picture Here>

Appendix

Page 72: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 72

• 論理演算(AND,OR,NOT)を使用した複数条件指定

• 個々の条件のセレクティビティが合成される

• S1=条件P1のセレクティビティ

• S2=条件P2のセレクティビティ

セレクティビティとカーディナリティ複数条件が指定された場合のセレクティビティ

論理演算 セレクティビティの合成

P1 AND P2 S1 * S2

P1 OR P2 S1+S2-(S1*S2)

NOT P1 1-S1

Page 73: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 73

• バインドピーク機能とは• バインド変数内の値を先読みする

• バインドピーク機能が有効な場合• SQLの解析(ハードパース)時にセットされた値で算出される

• ヒストグラムが存在する場合はヒストグラムの値を元に算出される

• その後にバインド変数値が異なるSQLが実行されても、ハードパース時の値で算出された実行計画が使われる

• バインドピーク機能が無効な場合• 条件が等価条件で指定された場合、1/NDVが選択率になる

• 条件が等価以外で指定された場合、0.05の固定値が選択率になる

• ヒストグラムが存在しても使用されない

セレクティビティとカーディナリティセレクティビティとバインド変数の関係

Page 74: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 7474

OTN×ダイセミ でスキルアップ!!

※OTN掲示版は、基本的にOracleユーザー有志からの回答となるため100%回答があるとは限りません。ただ、過去の履歴を見ると、質問の大多数に関してなんらかの回答が書き込まれております。

Oracle Technology Network(OTN)を御活用下さい。

・一般的な技術問題解決方法などを知りたい!・セミナ資料など技術コンテンツがほしい!

一般的技術問題解決にはOTN掲示版の

「データベース一般」をご活用ください

http://otn.oracle.co.jp/forum/index.jspa?categoryID=2

過去のセミナ資料、動画コンテンツはOTNの

「OTNセミナー オンデマンド コンテンツ」へ

http://www.oracle.com/technology/global/jp/ondemand/otn-seminar/index.html

※ダイセミ事務局にダイセミ資料を請求頂いても、お受けできない可能性がございますので予めご了承ください。ダイセミ資料はOTNコンテンツ オン デマンドか、セミナ実施時間内にダウンロード頂くようお願い致します。

Page 75: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 7575

OTNセミナー オンデマンド コンテンツ期間限定にて、ダイセミの人気セミナーを動画配信中!!

ダイセミのライブ感はそのままに、お好きな時間で受講頂けます。

※掲載のコンテンツ内容は予告なく変更になる可能性があります。期間限定での配信コンテンツも含まれております。お早めにダウンロード頂くことをお勧めいたします。

OTN オンデマンド

Page 76: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 76

オラクル クルクルキャンペーン

76

Enterprise Editionはここが違う!!

• 圧倒的なパフォーマンス!

• データベース管理がカンタン!

• データベースを止めなくていい!

• もちろん障害対策も万全!

Oracle Databaseのライセンス価格を大幅に抑えて

ご導入いただけます

詳しくはコチラ

http://www.oracle.co.jp/campaign/kurukuru/index.html

あのOracle Database Enterprise Editionが超おトク!!

お問い合わせフォームhttp://www.oracle.co.jp/inq_pl/INQUIRY/quest?rid=28

多くのお客様でサーバー使用期間とされる

5年間にライセンス期間を限定

• 期間途中で永久ライセンスへ差額移行

• 5年後に新規ライセンスを購入し継続利用

• 5年後に新システムへデータを移行

Page 77: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 7777

http://www.oracle.co.jp/inq_pl/INQUIRY/quest?rid=28

Oracle Direct 検索

あなたにいちばん近いオラクル

Oracle Directまずはお問合せください

Web問い合わせフォーム フリーダイヤル

専用お問い合わせフォームにてご相談内容を承ります。

※フォームの入力には、Oracle Direct Seminar申込時と同じログインが必要となります。

※こちらから詳細確認のお電話を差し上げる場合がありますので、ご登録されている連絡先が最新のものになっているか、ご確認下さい。

0120-155-096

※月曜~金曜 9:00~12:00、13:00~18:00

(祝日および年末年始除く)

システムの検討・構築から運用まで、ITプロジェクト全般の相談窓口としてご支援いたします。

システム構成やライセンス/購入方法などお気軽にお問い合わせ下さい。

Page 78: Oracle Direct Seminar...YES NO YES NO NO YES NO SQLパフォーマンス問題解決へのアプローチ 非定型的なSQLチューニングの進め方 【STEP1】CBOのインプット情報を考慮する

Copyright© 2009, Oracle. All rights reserved. 7878

以上の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。

OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録 商標である場合があります。