Null

Similar documents
DBA & Developer Day 2016 ダウンロード資料

#odddtky Oracle DBA & Developer Days 2014 for your Skill 使える実践的なノウハウがここにある 津島博士のパフォーマンス講座 SQL チューニングの基礎 日本オラクル株式会社データベース事業統括製品戦略統括本部データベースエンジニアリング本部 担

はじめに コースの概要と目的 Oracle をより効率的に使用するための SQL のチューニング方法について説明します また 索引の有無 SQL の 記述方法がパフォーマンスにどのように影響するのかを実習を通して理解します 受講対象者 アプリケーション開発者 / データベース管理者の方 前提条件 S

~~~~~~~~~~~~~~~~~~ wait Call CPU time 1, latch: library cache 7, latch: library cache lock 4, job scheduler co

Null

PA4

第 5 章 結合 結合のパフォーマンスに影響を与える結合の種類と 表の結合順序について内部動作を交えて 説明します 1. 結合処理のチューニング概要 2. 結合の種類 3. 結合順序 4. 結合処理のチューニングポイント 5. 結合関連のヒント

津島博士のパフォーマンス講座

untitled

Null

Null

PowerPoint Presentation

Oracle パブリック・クラウド・サービス無料トライアル 申込手順書

PowerPoint Presentation

MaxGauge_診断分析プロセス

Oracle Database 10g Release 2を使用したデータベース・パフォーマンス

標準化 補足資料

今さら聞けない!? Oracle入門 ~後編~

PostgreSQL SQL チューニング入門 ~ Explaining Explain より ~ 2012 年 11 月 30 日 株式会社アシスト 田中健一朗

Oracle Code Tokyo 2017 ダウンロード資料

How to Use the PowerPoint Template

スライド 1

How to Use the PowerPoint Template

A. 前ページからの続きです DBMS_SPACE.UNUSED_SPACE の各パラメータの意味 segment_owner = オブジェクトの所有者 segment_name = オブジェクト名 segment_type = オブジェクトタイプ total_blocks = セグメント合計ブロッ

はじめに コース概要と目的 Oracle データベースのパフォーマンス問題の分析方法 解決方法を説明します 受講対象者 データベース管理者の方を対象としています 前提条件 データベース アーキテクチャ データベース マネジメント を受講された方 もしくは同等の知識 をお持ちの方 テキスト内の記述につ

Slide 1

Oracle Data Pumpのパラレル機能

第 3 章代表的なチューニングポイント 3 Q. ストアド プロシージャを使用した SQL 共有率の向上 A. ストアド プロシージャを使用した場合 同じストアド プロシージャを実行する複数のユーザーが 同じ共有 PL/SQL 領域を使用します また ストアド プロシージャは解析済みで格納されている

Microsoft PowerPoint - db03-5.ppt

ORACLE TUNING PACK 11G

Microsoft PowerPoint - 講義補助資料2017.pptx

Null

Oracle Database Connect 2017 JPOUG

OWI(Oracle Wait Interface)の概要

このドキュメントに記載されている情報 (URL 等のインターネット Web サイトに関する情報を含む ) は 将来予告なしに変更することがあります このドキュメントに記載された内容は情報提供のみを目的としており 明示または黙示に関わらず これらの情報についてマイクロソフトはいかなる責任も負わないもの

Oracle 入門 ~ 研修受講後のスキルアップサポート ~ 対応バージョン :Oracle 10gR1 ~ 12cR1 本資料は アシスト Oracle 研修をご受講いただいたお客様からのご質問や 研修ではご案内できなかった情報などを FAQ にまとめたものです 研修受講後のスキルアップの一助とし

データセンターの効率的な資源活用のためのデータ収集・照会システムの設計

5-D オラクルコンサルが語るJava SE 8の勘所

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

バッチ処理にバインド変数はもうやめません? バッチ処理にバインド変数はもうやめません?

今さら聞けない!?大規模テーブルのパフォーマンスチューニング ~パーティショニング~

これは何? ORACLE の内部状態を示す情報の一つである 待機イベントについて解説します 待機イベントを知ることで 一歩進んだパフォーマンスチューニングが出来ます また 待機イベントという切り口を通して ORACLE のアーキテクチャに対する理解を深めていきます なお ORACLE のバージョンは

Slide 1

Oracle SQL Developerの移行機能を使用したOracle Databaseへの移行

リレーショナルデータベース入門 SRA OSS, Inc. 日本支社 Copyright 2008 SRA OSS, Inc. Japan All rights reserved. 1

結合演算 ( 復習 ) データベース論 (9) R 社員番号 氏名麻生太郎安部晋三与謝野馨森喜朗 部門経理課営業課総務課営業課 S 部門経理課営業課総務課 電話 問合せ言語と SQL(2) R S 社員番号

,, create table drop table alter table

How to Use the PowerPoint Template

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

Slide 1

Microsoft Word - nvsi_050090jp_oracle10g_vlm.doc

PowerPoint Presentation

PowerPoint Presentation

Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be

Oracle Database 19c の注目ポイント 年 07 月 23 日株式会社コーソル渡部亮太 Copyright 2019 CO-Sol Inc. All Rights Reserved. 1

1,.,,,., RDBM, SQL. OSS,, SQL,,.

プレポスト【問題】

第 1 章 条件分岐 この章では 条件に応じて処理を分岐する方法について説明します 1. CASE 式で複雑な条件分岐を実現 2. 関数を使用した条件分岐 3. MERGE 文による条件に応じた DML の実行

Web 環境におけるレイヤー別負荷の 2 違い DB サーバ AP サーバ 後ろのレイヤーほど負荷が高く ボトルネックになりやすい

Oracle Data Pumpのパラレル機能

第 7 章 ユーザー データ用表領域の管理 この章では 表や索引を格納するユーザー データ用表領域の作成や 作成後のメンテナンスに ついて解説します 1. ユーザー データ用表領域の管理概要 2. ユーザー データ用表領域作成時の考慮事項 3. ユーザー データ用表領域の作成 4. ユーザー データ

Microsoft Word - Android_SQLite講座_画面800×1280

Oracle Tuning Pack

ORACLE PARTITIONING

PowerPoint Presentation

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

Oracle Database Technology Night ~ 集え! オラクルの力 ( チカラ ) ~ Oracle Database 18c テクノロジーシリーズ 4 Development と Performance 関連の機能強化 ~ Performance ~ 日本オラクル株式会社ソ

1 SQL Server SQL Oracle SQL SQL* Plus PL/SQL 2 SQL Server SQL Server SQL Oracle SQL SQL*Plus SQL Server GUI 1-1 osql 1-1 Transact- SQL SELECTFROM 058

DB12.2 CoreTech Seminar Overview

自己管理型データベース: アプリケーションおよびSQLチューニング・ガイド

Agenda はじめに 目的とゴール Part1の振り返り AWRを使用した性能分析 AWR 概要 AWRに格納される情報 AWR レポートにおける分析アプローチ AWR 確認ポイント Case Study AWRとアーキテクチャの関係 まとめ Part2のポイント まとめ Copyright 20

PowerPoint Presentation

今さら聞けない!? Oracle入門 ~前編~

Calpont InfiniDBマルチUM同期ガイド

Oracle Database 11g Oracle Real Application Testing

サポートエンジニアが語るパフォーマンス問題の原因調査とチューニング 日本オラクル株式会社データベーステクノロジーサポート本部 Principal Technical Support Engineer 田島教子

eラーニング資料 e ラーニングの制作目標 データベース編 41 ページデータベースの基本となる概要を以下に示す この内容のコースで eラーニングコンテンツを作成予定 データベース管理 コンピュータで行われる基本的なデータに対する処理は 次の 4 種類です 新しいデータを追加する 既存のデータを探索

スライド 1

Enterprise Manager 10gによるデータベース・パフォーマンスチューニング

How to Use the PowerPoint Template

リアルタイムSQL監視

PowerPoint Presentation

目次 1 集計関数 / 分析関数とは 2 集計関数 / 分析関数のパフォーマンス効果 3 ケーススタディグループ小計やクロス集計を計算するランキングを表示する前月比較を表示する累計を計算する移動平均を計算する構成比を計算する Oracle8i SQL Oracle8i Oracle Oracle C

Slide 1

Chapter Two

データベースS

基本サンプル

Null

以 下 の 事 項 は 弊 社 の 一 般 的 な 製 品 の 方 向 性 に 関 する 概 要 を 説 明 するものです また 情 報 提 供 を 唯 一 の 目 的 とするものであり いかなる 契 約 にも 組 み 込 むことは できません 以 下 の 事 項 は マテリアルやコード 機 能 を

アジェンダ ORACLE MASTER Oracle Database 11g 概要 11g SQL 基礎 Ⅰ 試験紹介 ポイント解説 Copyright 2011 Oracle. All rights reserved. 2

第 3 章 メディア障害とバックアップ リカバリ この章では メディア障害の発生に備えたバックアップ方法と 障害時の基本的なリカバリ方法につい て説明します 1. メディア リカバリ概要 2. ファイルの多重化 3. アーカイブ モードの設定 4. バックアップ概要 5. 一貫性バックアップ ( オ

Oracle9i


Microsoft PowerPoint - J-S301167_idx_comp.ppt [互換モード]

基本サンプル

Slide 1

PassSureExam Best Exam Questions & Valid Exam Torrent & Pass for Sure

スライド 1

Oracle Advanced Compression:ディスクの節約とデータベースの高速化を可能にする包括的な圧縮機能

Transcription:

Oracle Database Technology Night ~ 集え! オラクルの力 ( チカラ )~ パフォーマンス チューニングの極意津島博士の明日から使える SQL チューニング 日本オラクル株式会社クラウド テクノロジー事業統括 Database & Exadata プロダクトマネジメント本部応用技術部担当ディレクター津島浩樹

Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle s products remains at the sole discretion of Oracle. 2

Agenda 1 2 3 AWRからの解析 SQL チューニングオプティマイザ統計 3

AWR からの解析 解析できないもの DB Timeベースのチューニング AWRについて 待機イベント サンプルAWR 4

AWR からの解析解析できないもの データベースに負荷が掛っていない アプリケーション側の問題 データベース処理以外の時間が多い どんな処理か 大量のデータを持ってきてアプリケーションで処理する 必要な ( 処理をした ) データだけを持ってきましょう Row by Row 処理 ( 繰返し処理でデータベースに 1 行づつアクセスする ) 結合などはデータベースで行いましょう バッチ処理で多い OS 統計でリソース (CPU I/O など ) の使用状況から判断 5

AWR からの解析 DB Time ベース チューニング (DB Time とアクティブ セッション ) DB Time( データベース時間 ) すべてのデータベース内処理に要したセッション ( フォアグランド ) の合計時間 (CPU 時間 I/O 時間 非アイドル待機時間が含む ) Active Session( アクティブ セッション ) 現在データベース内で処理を行っている (DB Time 中の ) セッション %Activity( 平均アクティビティ ) 実経過時間とアクティブな ( データベースを使用した ) 時間の割合 本を閲覧する一冊の本のレビューを読むカートに入れる精算する SQL = データベースを使用した時間 アクティブ セッション 時間 ユーザ 1 6

AWR からの解析 DB Time ベース チューニング ( 複数セッションのとき ) DB Time: すべてのセッションのデータベース時間の合計 Average Active Sessions( 平均アクティブ セッション ) すべてのセッションの平均アクティブ数 アクティブ セッションが多い時間帯が負荷が多い 時間 t には 2 つのアクティブ セッションが存在する ユーザ 1 ユーザ 2 ユーザ 3 = データベースを使用した時間 t ユーザ n 時間 7

AWR からの解析 DB Time ベース チューニング (DB Time の可視化 ) 平均アクティブ セッション = 全データベース時間 全アクティブ セッションの経過時間 ユーザ1 ユーザ2 ユーザ3 ユーザn t0 t1 4 3 2 1 経過時間 アクティブ セッションの経過 アクティブ セッション (DB Time 中のセッション ) 数から負荷を見る 時間 8

AWR からの解析 DB Time ベース チューニング (EM パフォーマンス ページ ) 待機クラスごとのアクティブ セッションの経過 カラー領域の合計 = DB Time これの待機イベントごとが AWR では Top 5 Timed Events 9

AWR からの解析 DB Time ベース チューニング ( システムのパフォーマンスと DB Time) システム負荷の増加 ( セッション数の増加など ) 競合待機時間などの増加 (=> DB Time の増加 ) DB マシンが CPU ネック CPU 実行時間の増加 (=> DB Time の増加 ) I/O パフォーマンスの低下 I/O 時間の増加 (=> DB Time の増加 ) バックグランド (BG) プロセスについて BG プロセスが原因でも DB Time に現れる ( 例 log parallel write が多いと log file sync も増える ) BG プロセスは H/W リソースが問題なければ影響は少ない 待機時間 待機時間 ユーザ 1 db file sequential read 競合待機 CPU 実行 db file sequential read 競合待機 CPU 実行 I/O 時間 I/O 時間 10

AWR からの解析 AWR について (AWR 内での時間 ) DB Time( データベース時間 ) フォアグランドがデータベース内で処理した合計時間 応答時間 (Elapsed Time) DB CPU(CPU 時間 ) DB Time 内での CPU 時間 (DB CPU / DB Time CPU 使用率 ) バックグランド プロセスは (Oracle データベース以外も ) 含まれない CPU リソースの限界は判断できない (CPU% の分母は利用可能な CPU 時間 ) 待機時間が存在しても CPU 使用率が 100% になるときもある CPU 使用率は OS 統計から (AWR はスナップショット間の平均値なので判断できない ) SQL ordered by Elapsed Time(SQL 経過時間の合計 ) SQL で使用した DB Time 応答時間 (Elapsed Time) パラレル実行では全スレーブ プロセスの合計時間 11

AWR からの解析 AWR について (Report Summary) Load Profile Oracle データベースに対する負荷 Oracle データベースに対する負荷の変化などを監視 / 比較 Instance Efficiency Percentages (Target 100%) インスタンス内の効率良さ (100% に近いほど効率が良い ) インスタンス チューニングの判断 ( そうでなければ SQL チューニング =>SQL 統計 : by Elapsed Time ) バッファ キャッシュ ヒット率など Top 5 Timed Foreground Events フォアグランド イベント時間 (DB Time の内訳 ) の上位 5( または上位 10) ここで問題は何か ( どのイベントが多いのか ) を特定する 12

AWR からの解析待機イベント ( 体表的なもの ) I/O 非ダイレクト I/O, ダイレクト I/O など <= 第 26 回 エンキュー HW(HWM), SQ( シーケンス ), TX( 行ロック ) など <= 第 18 回 ライブラリ キャッシュ 共有カーソル関係 (cursor: xxx, library cache: xxx など )<= 第 32 回 ライブラリ キャッシュ オブジェクト ( 同じ SQL や PL/SQL パッケージの実行 )<= 第 50 回 マニュアルにない待機イベント SR で問い合わせてください 13

AWR からの解析待機イベント (I/O) 代表的な I/O 統計 db file sequential read( 索引スキャン ) db file scattered read / direct path read( フル スキャン ) direct path read temp / direct path write temp( 一時表への I/O) I/O 性能の確認 ( 問題なければ SQL チューニングへ ) I/O 統計の Av Rd(ms) など OS 統計 (sar, iostat) の %Busy など SQL の特定 SQL 統計 (SQL ordered by User I/O Wait Time) 実行計画の出力 (AWR のスナップショットから ) $ORACLE_HOME/rdbms/admin/awrsqrpt.sql(Actual Rows が出力されない ) 14

AWR からの解析待機イベント ( 子カーソル ) 子カーソルとは ( 第 7 回 ) 同じ SQL で別の実行計画を作成すること ( ハード パースが増える ) 子カーソルの待機イベント 11.1 以上は cursor: mutex 関係 10.2 以前は library cache pin SQL 統計の SQL ordered by Version Count( 子カーソルの多い SQL) 子カーソルが作成される原因は V$SQL_SHARED_CURSOR を参照 代表的なもの カーディナリティ フィードバック バイド ピーク /Adaptive Cursor Sharing( 優れたカーソル共有 ) バインド変数の属性が異なる スキーマ オブジェクトが異なるなど 15

AWR からの解析サンプル AWR サンプルの AWR を見てみる パース時間に対する CPU 時間の割合 CPU 時間以外 ( ラッチなど ) が多いか Execute to Parse % : パースなし ( カーソルキャッシュ ) で実行された割合 % non-parse CPU : パース以外で使用された CPU 時間の割合 16

アジェンダ 1 2 3 AWR からの解析 SQL チューニング オプティマイザ統計 17

SQL チューニング SQL の基本知識 索引を使用しない条件 結合条件 (1=1) WHERE 句条件 (1=2) 問合せ変換 (Query Transformation) 実行計画の見方 必要最低限のもの 実行計画のチューング チューニング手順 SQL ヒントなど 18

SQL チューニング SQL の基礎知識 ( 索引を使用しない条件 ) 演算している (BI ツールなどは注意 ) NULL 比較 NOT(!=) OR 条件 (IN リスト ) OR 拡張 (UNION ALL に変換 ) で索引を使用 後方一致 ( 中間一致 ) 条件 索引スキップ スキャン (9i から ) 全表スキャンより効果的なとき ( 先頭の個別値が少ないときなど ) に使用 意識して使用する ( 第 9 回 ) 19

SQL チューニング SQL の基礎知識 ( 結合条件 (1=1) WHERE 句条件 (1=2)) 異なる結合を同じ構文で行うようなとき ( 動的 SQL で多い ) 結合効率が悪いので行わない ( 第 44 回 ) /* すべてを FULL OUTER JOIN で行う */ IF abc = '01' THEN - すべての行にMAX(c1) を入れる v_from := '(SELECT MAX(c1) c1 FROM tab2 WHERE c2 = 1) B ON (1=1)'; ELSIF abc = '02' THEN -- 結合しない v_from := '(SELECT c1 FROM tab2 WHERE (1=2)) B ON ON A.c1 = B.c1'; ELSE - 通常のFULL OUTER JOIN v_from := 'tab2 B ON A.c1 = B.c1'; END IF v_stmt_str := 'SELECT FROM tab1 A FULL OUTER JOIN ' v_from; OPEN v_tab3_cursor FOR v_stmt_str; 20

SQL チューニング SQL の基礎知識 ( 問合せ変換 ) 無駄な処理の排除 結合 ( 外部キー ) ORDER BY( インライン ビュー内 ) DISTINCT( 主キー )<= 第 34 回 ビュー ( インライン ビュー ) の最適化 ( 次頁 ) 副問合せのネスト解除 ( セミ結合 アンチ結合 ) IN の方が制約が多いので EXISTS を使用する ( 第 29 回 ) OR 条件で変換されないときがある ( 第 44 回 第 52 回 ) UNION ALL に変換 (OR 拡張 表拡張 <= 索引が使用可と使用不可のパーティションに ) 索引を使用するように ( 第 9 回 第 34 回 ) パラレル実行時の OR 拡張は一部シリアル処理に ( 第 52 回 ) 21

SQL チューニング SQL の基礎知識 ( ビュー インライン ビュー ) ビューとは アクセス制御などで使用 ( 条件は外で指定 ) 最初に実行される 特性 ( メリット / デメリット ) 結合順が調整できない <= 例の tab1 は最後の結合に ビュー実行後は索引が使用できない <= 例の A.c1=B.c1 を B.c1 の索引を使用したネステッド ループ結合にできない 結合前に行数を削減できる (DISTINCT Group By など ) <= 例のインライン ビューに Group by がなくても結果は同じ ( 主問合せで Group by しているから ) ビューの問合せ変換 ビューを使用しない 結合順を変えたい 索引を使用したい View Merging( ビュー マージ )<= 第 29 回 ビューが効果的なとき ( ビューを作成 ) Group by Placement (Group by の配置 )<= 第 42 回 ビューをマージできない / しない Group by 後にネステッド ループ結合するなど Predicate Pushing( 述語のプッシュ )<= 第 29 回 SQL> SELECT A.c2, SUM(b2), SUM(b3) FROM tab1 A, 2 (SELECT C.c1 b1, SUM(C.c2) b2, SUM(D.c2) b3 3 FROM tab2 C,tab3 D 4 WHERE C.c1 = D.c1 AND C.c3 < 100 5 GROUP BY C.c1) B 6 WHERE A.c1 = B.c1 GROUP BY A.c2 ; 22

SQL チューニング実行計画の見方 ( 注目する項目 ) カーディナリティ 述語を適用した行数 (Rows E-Rows A-Rows) アクセス方法 索引スキャン 全表スキャン ビュー アクセス 結合方法 ネステッド ループ結合 ハッシュ結合 ソート マージ結合 直積結合 結合タイプ 内部結合 外部結合 セミ結合 アンチ結合 結合順序 SQL によって決まる場合も パーティション パーティション プルーニング ( 第 22 回 第 46 回 ) 静的 ( アクセスする番号 ) 動的 (KEY KEY(OR) など ) 11gR2 から KEY(AP) が追加 AND Pruning( 静的 + 動的 ) パラレル実行 スキャンのデータ分散 ( 第 20 回 第 39 回 ) ブロック単位で分割 (PX BLOCK ITERATOR) パーティション単位 (PX PARTITION RANGE ALL など ) パーティション ワイズ結合など 23

SQL チューニング実行計画の見方 ( 注目する項目 ) パラレル実行 ( 続き ) スキャン以外のデータ再分散 ( 第 20 回 第 39 回 ) HASH( 基本はこれを使用する ) RANGE( ソートなど )<= 偏りやすい BROADCAST( 結合時の片方が小さい ) 同じデータをすべてのプロセスに PARTITION( パーティション ワイズ結合 ) パーティション分割 ( 片方がパーティション表のとき ) NONE( データ分散しない / データ通信しない ) 操作間パラレル化 QC OrderBy PQ PQ PQ PQ 結合 PQ PQ PQ PQ スキャン PQ PQ PQ PQ 3 1 2 PX SEND xxxx と PX RECEIVE がない PARTITION や BROADCAST などと使用 表 偏りが発生すると効果が低下する PQ_DISTRIBUTE ヒントで調整 PX SEND xxxx PX RECEIVE 操作内パラレル化 24

SQL チューニング実行計画の見方 リーフ ステップ ( インデントの一番深いステップ ) から実行して 結合 ( 同一インデント ) は上位に表示されたものが最初になる SQL> SELECT FROM tab1,tab2,tab3 WHERE tab1.c2=tab2.c2 AND tab1.c3=tab3.c3 AND tab1.c1<100 2 GROUP BY ORDER BY ; TABLE ACCESS BY INDEX ROWID TAB1 結合 INDEX RANGE SCAN IX_TAB1 実行計画 ----------------------------------------------< >----------------- 索引アクセス Id Operation Name Rows Pstart Pstop VIEW ----------------------------------------------< >----------------- HASH GROUP BY 0 SELECT STATEMENT TABLE ACCESS FULL TAB1 1 SORT GROUP BY 3 ビュー アクセス * 2 HASH JOIN 2 * 3 HASH JOIN 1 パーティション プルー * 4 (1) TABLE ACCESS FULL TAB1 10 1 1 ニング ( 動的 :KEYなど) 5 (2) TABLE ACCESS FULL TAB2 50 カーディナリティ 6 (3) TABLE ACCESS FULL TAB3 100 ( 絞り込まれた行数 ) 25

SQL チューニング実行計画の見方 ( パラレル実行 ) SQL> SELECT * FROM tab01,tab02 WHERE tab01.c1 = tab02.c1 ORDER BY c0; 実行計画 結合プロセス ( 同じ ) ------------------------------------------------< >------------------------------- Id Operation Name TQ IN-OUT PQ Distrib ------------------------------------------------< >------------------------------- 0 SELECT STATEMENT 1 PX COORDINATOR 2 PX SEND QC (ORDER) :TQ10003 Q1,03 P->S QC (ORDER) 3 SORT ORDER BY Q1,03 PCWP 4 PX RECEIVE Q1,03 PCWP 5 PX SEND RANGE :TQ10002 Q1,02 P->P RANGE 6 HASH JOIN BUFFERED Q1,02 PCWP 7 PX RECEIVE Q1,02 PCWP 8 PX SEND HASH :TQ10000 Q1,00 P->P HASH 9 PX BLOCK ITERATOR Q1,00 PCWC 10 TABLE ACCESS FULL TAB01 Q1,00 PCWP 11 PX RECEIVE Q1,02 PCWP 12 PX SEND HASH :TQ10001 Q1,01 P->P HASH 13 PX BLOCK ITERATOR Q1,01 PCWC 14 TABLE ACCESS FULL TAB02 Q1,01 PCWP PX SEND PARTITION PX SEND BROADCAST データ分散 PX PARTITION RANGE ALL スキャンの分散 26

SQL チューニング実行計画の見方 後半には 述語の情報と Note 部が出力される 実行計画 -------------------------------------- Id Operation Name -------------------------------------- 0 SELECT STATEMENT 1 SORT GROUP BY * 2 HASH JOIN * 3 HASH JOIN * 4 TABLE ACCESS FULL TAB1 5 TABLE ACCESS FULL TAB2 Predicate Information (identified by operation id): --------------------------------------------------- 述語の情報 2 - access("tab1"."c2"="tab2"."c2") 3 access("tab1"."c3"="tab3"."c3") 4 filter("tab1"."c1"<100) Note 部 Note ----- - dynamic sampling used for this statement (level=2) 27

SQL チューニング実行計画の見方 ( ネステッド ループ結合 ) 通常のネステッド ループ結合 基本は内部表の索引を使用して結合 駆動表の 1 行に対して索引アクセス Multi Join Key Pre-fetching(9i から ) 第 34 回 索引範囲スキャンのデータ ブロックの先読み Nested Loops Join Batching(11g から ) 第 34 回 索引で結合後に ROWID を並べ替えてテーブルにアクセス 索引一意スキャンでも可 SQL> SELECT FROM tab1,tab2 WHERE tab1.c1 = tab2.c1 GROUP BY ; 実行計画 ------------------------------------------------- Id Operation Name ------------------------------------------------- 0 SELECT STATEMENT 1 HASH GROUP BY 2 NESTED LOOPS 実行計画 3 TABLE ACCESS FULL TAB2 <- 駆動表 ------------------------------------------------ 4 TABLE ACCESS BY INDEX ROWID TAB1 <- 内部表 * Id 5 Operation INDEX RANGE SCAN Name IX_TAB1 ------------------------------------------------ 0 SELECT STATEMENT 1 HASH GROUP BY 2 TABLE ACCESS BY INDEX ROWID TAB1 内部表をPer-fetchする 3 NESTED LOOPS 実行計画 4 TABLE ACCESS FULL TAB2 駆動表 ------------------------------------------------- * 5 INDEX RANGE SCAN IX_TAB1 内部表 Id Operation Name ------------------------------------------------- 0 SELECT STATEMENT 結果を駆動表 (2) として 1 HASH GROUP BY 2 NESTED LOOPS Nested Loops Join(2) 3 NESTED LOOPS Nested Loops Join(1) 4 TABLE ACCESS FULL TAB2 駆動表 (1) * 5 INDEX RANGE SCAN IX_TAB1 内部表 (1) 6 TABLE ACCESS BY INDEX ROWID TAB1 内部表 (2)( ここを改善 ) 28

SQL チューニング実行計画の見方 ( ソート マージ結合 直積結合 ) ソート マージ結合 索引の代わりにソートして結合 等価結合以外など 直積結合 できるだけ行わない 結合条件がないので効率が悪い SQL> SELECT FROM tab1,tab2 WHERE tab1.c1 > tab2.c1 2 GROUP BY ; 実行計画 --------------------------------------------- Id Operation Name Rows --------------------------------------------- 0 SELECT STATEMENT 1 HASH GROUP BY 2 MERGE JOIN xxx 3 SORT JOIN 100 4 TABLE ACCESS FULL TAB2 100 * 5 SORT JOIN 100K 6 TABLE ACCESS FULL TAB1 100K SQL> SELECT FROM tab1,tab2 GROUP BY ; 実行計画 ---------------------------------------------- Id Operation Name Rows ---------------------------------------------- 0 SELECT STATEMENT 1 HASH GROUP BY 2 MERGE JOIN CARTESIAN 3 TABLE ACCESS FULL TAB2 100 4 BUFFER SORT 100K 5 TABLE ACCESS FULL TAB1 100K 29

SQL チューニング実行計画の見方 ( ハッシュ結合 外部結合 ) ハッシュ結合 ( 等価結合のみ ) 索引の代わりにメモリ上にハッシュ テーブルを作成 ( 最初にアクセスした表に ) スター スキーマは Right-deep Join が効果的 (SWAP_JOIN_INPUTS ヒント )<= 第 46 回 SQL> SELECT FROM tab1,tab2,tab3 2 WHERE tab1.c1=tab2.c1 AND tab1.c2=tab3.c2 3 AND tab2.c3=xxx AND tab3.c2=xxx GROUP BY ; 実行計画 (Left-deep Join) 実行計画 (Right-deep Join) ------------------------------------- ------------------------------------- Id Operation Name Id Operation Name ------------------------------------- ------------------------------------- 0 SELECT STATEMENT 0 SELECT STATEMENT 1 HASH GROUP BY 1 HASH GROUP BY * 2 HASH JOIN * 2 HASH JOIN * 3 HASH JOIN * 3 TABLE ACCESS FULL TAB3 * 4 TABLE ACCESS FULL TAB2 * 4 HASH JOIN 5 TABLE ACCESS FULL TAB1 * 5 TABLE ACCESS FULL TAB2 * 6 TABLE ACCESS FULL TAB3 6 TABLE ACCESS FULL TAB1 外部結合 LEFT OUTER JOIN, RIGHT OUTER JOIN ハッシュ結合で核でないテーブルを先にアクセス可能に (10g から ) SQL> SELECT FROM tab1 LEFT OUTER JOIN tab2 USING (c1) GROUP BY ; 実行計画 ------------------------------------ Id Operation Name ------------------------------------ 実行計画 (Oracle Database 10gから ) 0 SELECT STATEMENT --------------------------------------- 1 HASH GROUP BY Id Operation Name 2 HASH JOIN OUTER --------------------------------------- 3 TABLE ACCESS FULL TAB1 0 SELECT STATEMENT 4 TABLE ACCESS FULL TAB2 1 HASH GROUP BY 2 HASH JOIN RIGHT OUTER 3 TABLE ACCESS FULL TAB2 4 TABLE ACCESS FULL TAB1 30

SQL チューニング実行計画の見方 ( セミ結合 アンチ結合 ) セミ結合 EXISTS, IN 条件の副問合せ セミ ハッシュ結合で副問合せのテーブルを先にアクセス可能に (10g から ) アンチ結合 NOT EXISTS, NOT IN 条件の副問合せ アンチ ハッシュ結合で副問合せのテーブルを先にアクセス可能に (10g から ) SQL> SELECT FROM tab1 WHERE EXISTS 2 (SELECT 0 FROM tab2 WHERE tab1.c1 = tab2.c1) ; 実行計画 ----------------------------------- Id Operation Name ----------------------------------- 0 SELECT STATEMENT 1 HASH JOIN SEMI 2 TABLE ACCESS FULL TAB1 3 TABLE ACCESS FULL TAB2 実行計画 (Oracle Database 10gから ) ------------------------------------- Id Operation Name ------------------------------------- 0 SELECT STATEMENT 1 HASH JOIN RIGHT SEMI 2 TABLE ACCESS FULL TAB2 3 TABLE ACCESS FULL TAB1 SQL> SELECT FROM tab1 WHERE NOT EXISTS 2 (SELECT 0 FROM tab2 WHERE tab1.c1 = tab2.c1) ; 実行計画 ----------------------------------- Id Operation Name ----------------------------------- 0 SELECT STATEMENT 1 HASH JOIN ANTI 2 TABLE ACCESS FULL TAB1 3 TABLE ACCESS FULL TAB2 実行計画 (Oracle Database 10gから ) ------------------------------------- Id Operation Name ------------------------------------- 0 SELECT STATEMENT 1 HASH JOIN RIGHT ANTI 2 TABLE ACCESS FULL TAB2 3 TABLE ACCESS FULL TAB1 31

SQL チューニング実行計画のチューニング チューニングの手順 1. オプティマイザ統計の再収集 2. 索引の作成 ( 索引のチューニング ) 3. SQLの変更 ( ヒントの追加 ) SQL の変更ができない SPM (SQL Plan Management) の SQL 計画手動ロード ( 第 38 回 ) ヒントを入れた実行計画をベースラインとして登録する SQL 翻訳フレームワーク ( 第 51 回 ) SQL を変更したいとき (SQL の置き換え方法を登録 ) 問題を特定できない SQL チューニング アドバイザ ( 第 38 回 ) 32

SQL チューニング問題となる実行計画 ( 主な SQL) と対処 問題点 統計ヒント SQL などの変更 結合方法や結合順が最適でない 副問合せの追加 / 削除など 問合せ変換が最適でない 明示的に SQL を変更 索引が使用できていない 索引を使用できるように変更 索引を作成 同じような副問合せがある SQL を分割する (WITH 句を使用する ) 第 11 回 同じ表に異なる条件で SELECT している SQL を CASE 式で 1 つに第 24 回 同じ表に異なる条件で INSERT している SQL をマルチ テーブル インサートに ( 同じ表でも可 ) 第 24 回 同じ表を UPDATE 文と INSERT 文でアクセス SQL を MERGE 文で 1 つに第 30 回 結合した UPDATE 文 SQL( 複雑な副問合せを使用する ) を MERGE 文に第 30 回 Redo ログ出力がネック ( 特にパラレル DML) ダイレクト パス インサートに (UPDATE DELETE も ) 第 15 回 TEMP 領域を使用 パラレル度を上げる プログラムを分割 / 並列化 索引を使用する ( 結合 ソートなど ) 第 45 回 33

SQL チューニングオプティマイザ統計の再収集 行数の見積もりが正しくない ( 実行時と大きく異なるとき ) 実行計画の見積もり行数 (E-Rows) と実行行数 (A-Rows) を比較 SQL> SELECT /*+ GATHER_PLAN_STATISTICS */ c1,c2,c3 FROM tab01 WHERE c1 = 11 ; レコードが選択されませんでした SQL> SELECT * FROM TABLE(dbms_xplan.display_cursor(format=>'typical allstats last')); 実行計画 --------------------------------------------------------------------------------------------- Id Operation Name Starts E-Rows E-Bytes A-Rows --------------------------------------------------------------------------------------------- 0 SELECT STATEMENT 1 0 1 TABLE ACCESS BY INDEX ROWID TAB01 1 21 189 0 * 2 INDEX RANGE SCAN IX_TAB01 1 21 0 34

SQL チューニング実行計画の確認 (DBMS_XPLAN.DISPLAY_CURSOR 関数 ) 見積もり以外に実行時の統計も出力できる (STATISTICS_LEVEL=ALL またはヒント ) SQL> SELECET /*+ GATHER_PLAN_STATISTICS */ ; SQL> SELECT * FROM TABLE(dbms_xplan.display_cursor(sql_id=>'<sql_id>',format=>'typical allstats last')); 実行計画省略すると最後のSQL ------------------------------------------------------------------------------------------------- Id Operation Name Starts E-Rows E-Bytes Cost (%CPU) E-Time A-Rows A-Time ------------------------------------------------------------------------------------------------- ------------------------------------------- Buffers OMem 1Mem Used-Mem Used-Tmp ------------------------------------------- < 実行統計 > Starts: 実行された回数 Buffers: バッファのアクセス数 A-Rows: 処理行数 A-Time: 処理時間 Used-Mem: 使用されたメモリサイズと処理方法 (0:Optimal,1:1-pass,N;Multi-pass) Used-Tmp: 使用されたTEMPサイズ 35

SQL チューニング実行計画の確認 ( リアルタイム SQL 監視 ) 実行中の実行計画を表示 ( デフォルトで 5 秒以上の SQL MONITOR ヒントで強制的に ) 時間のかかっている SQL が自動的に監視されリストされる ( 経過時間等でソート可能 ) この SQL 実行全体の統計 実行計画のステップごとの統計など ステップごとの待機イベント 36

SQL チューニングオプティマイザ統計の再収集 サンプル サイズを大きくしても精度が上がらないとき ヒストグラムと拡張時計を確認 拡張統計は自動的に作成されない <=12c で改善 列グループ ( ないときは列値の組合せは均等となる ) WHERE c1 = xxx AND c2 = xxx( フィルター条件 結合 ) GROUP BY c1,c2 式 (BI ツールを使用しているときなど ) WHERE UPPER(c1) = xxx 一意値が多い列のヒストグラムには限界がある バケット数の最大が 254(12c から 2048 に拡張 ) 列サイズも 12c から拡張 (32 バイトから 64 バイト ) 37

SQL チューニング索引の作成 ( 索引のチューニング ) 全表スキャンを行っているテーブルは索引スキャンした方が良くないか 実行計画の Rows を確認 索引スキャンの効率が悪くないか 索引の列の組合せ 索引の列の順番などを確認 例えば 以下のような SQL SQL> SELECT WHERE c1=xx AND c2=xx AND c3=xx; SQL> SELECT WHERE c1=xx AND c3=xx; SQL> SELECT WHERE c1=xx AND c2=xx AND c4=xx; 優先順位を明確にして作成する これが難しい ( そのため フル スキャンでも高速な Exadata が効果的 ) 作り過ぎないように使用しない索引は削除する 38

SQL チューニング SQL の変更 ( 主な SQL の変更 ) 結合の UPDATE 文を MERGE 文に SQL> UPDATE t01 A 2 SET A.c3 = A.c3 + (SELECT c2 FROM t02 B WHERE A.c1 = B.c1) 3 WHERE EXISTS (SELECT 0 FROM t02 B WHERE A.c1 = B.c1); SQL> MERGE INTO t01 A 2 USING (SELECT c1,c2 FROM t02) B 3 ON (A.c1 = B.c1) 4 WHEN MATCHED THEN UPDATE SET A.c3 = A.c3 + B.c2; 繰り返し副問合せは WITH 句で UPDATE,DELETE もダイレクト インサートに SQL> DELETE FROM tab000 2 WHERE 日付 < TO_DATE( 20101001, YYYYMMDD ) ; SQL> CREATE TABLE tab001 NOLOGGING PARALLEL AS 2 SELECT * FROM tab000 3 WHERE 日付 >= TO_DATE( 20101001, YYYYMMDD ) ; SQL> DROP TABLE tab000 ; SQL> RENAME tab001 TO tab000 ; SQL> SELECT * FROM 2 (SELECT 部門,sum( 売上 ) 部門売上 FROM 売上表 GROUP BY 部門 ) w_a 3 WHERE 部門売上 < (SELECT avg( 部門売上 ) FROM 4 (SELECT 部門,sum( 売上 ) 部門売上 FROM 売上表 GROUP BY 部門 )); SQL> WITH w_a AS (SELECT 部門, sum( 売上 ) FROM 売上表 GROUP BY 部門 ) 2 SELECT * FROM w_a 3 WHERE 部門売上 < (SELECT avg( 部門売上 ) FROM w_a); 39

SQL チューニング SQL の変更 ( ヒント ) 表の別名があるときは別名を SQL> SELECT /*+ INDEX(A ix_tab1) */ * FROM tab1 A WHERE ; ビュー ( 副問合せ ) 内の表は参照しない SQL> SELECT /*+ INDEX(tab1 ix_tab1) */ * 2 FROM (SELECT * FROM tab1 WHERE ) A ; SQL> SELECT /*+ INDEX(A.tab1 ix_tab1) */ * 2 FROM (SELECT * FROM tab1 WHERE ) A ; 副問合せ内でも指定できる ( ビュー マージされて使用される ) 主に使用するヒント 結合順を変える (ORDERED, LEADING) ビュー マージを止める (NO_MERGE) 索引を使用する (INDEX, INDEX_FFS) 索引を使用しない (FULL, NO_INDEX) 結合方法を変える (USE_HASH, USE_MERGE, USE_NL) パラレル実行関係 (PARALLEL, PQ_DISTRIBUTE) 問合せ変換関連のヒント SQL> SELECT * FROM (SELECT /*+ INDEX(tab1 ix_tab1) */ * 2 FROM tab1 WHERE ) A ; 40

アジェンダ 1 2 3 AWR からの解析 SQL チューニング オプティマイザ統計 41

オプティマイザ統計 統計の種類 どのように使用されるか 収集方法 収集方法とデフォルトで収集されるもの 統計の補正 どこまで行えるか 42

オプティマイザ統計統計の種類 表統計 表アクセス コスト 行数 データ ブロック数 行連鎖 行移行の数 平均行長 索引統計 索引アクセス コスト 索引内の個別値数 索引の深さ (BLEVEL) リーフ ブロック数 クラスタ化係数 列統計 カーディナリティ サイズ 個別値数 NULL 数 平均列データ長 データ分布 ( 最小値と最大値 ヒストグラム ) システム統計 (I/O+CPU コスト モデル ) CPU 性能 I/O 性能 ( 単一ブロック リード マルチ ブロック リード ) パーティション表には パーティション サブ パーティションごとにも同様の情報を収集するアクセスする行数やブロック数を求め CPU 性能やI/O 性能でコストを計算する 43

オプティマイザ統計統計の種類 列統計 ( ヒストグラム ) ヒストグラムは完全には設定できないものも (12c で拡張 ) 異なる値が 255 以上の高さ調整済ヒストグラム バケット数が最大 254 なので 各値を別バケットに入れられない 拡張統計 ( 自動作成されない ) システム統計 (CPU 性能 I/O 性能 ) Exadata は固有のシステム統計を取得する (DB 稼働後一度だけで良い ) DBMS_STATS.GATHER_SYSTEM_STATS( EXADATA ); Exadata 以外 初回起動時のデフォルト値 ( 単一ブロック リード マルチ ブロック リード時間などがない ) で良いが 索引スキャンとフル スキャンを使用する場合は一度収集した方が良い 44

オプティマイザ統計統計の種類 ( 拡張統計 ) 列グループの統計 (Column Groups) 同一表内の複数列に跨る統計を保持することで 列データ間の相関関係を考慮したカーディナリティの計算を可能とする 例 : 顧客表の住所列と年代列など 12c からの SQL 計画ディレクティブ ( 第 52 回 ) と自動列グループ検出 ( 第 49 回 ) 式の統計 (Expression Statistics) 関数を含めた統計を保持することで 関数に組み込まれた列を持つ WHERE 句におけるカーディナリティの計算を可能する 例 :Where UPPER( 氏名 ) = :B1 45

オプティマイザ統計統計収集 自動オプティマイザ統計収集 22:00 から 26:00( 土日は 6:00 から 26:00) に自動実行する 独自の方式で収集しているシステム以外はこれを使用する ディクショナリだけの自動収集も可能 DBMS_STATS.SET_GLOBAL_PREFS( AUTOSTATS_TARGET, ORACLE ) オプティマイザ統計の手動収集 必要な ( 大量に変更があった ) ときを判断して実行する ディクショナリの手動収集 DDL を多く発行された後などに実行 DBMS_STATS.GATHER_DICTIONARY_STATS 46

オプティマイザ統計統計収集 ( 自動オプティマイザ統計収集 ) 自動的に収集するものを決める 10% 以上変更されたオブジェクト デフォルト値 収集する適切なサイズを Oracle が決定 (AUTO_SAMPLE_SIAZE) Oracle11g で拡張されたハッシュ アルゴリズム ( サンプリングより高速 Compute モード統計と同等精度 ) 索引統計の収集を自動判断 (AUTO_CASCADE) ヒストグラムの収集を自動判断 (FOR ALL COLUMNS SIZE AUTO) カーソルの無効化の時期を Oracle が決定 (AUTO_INVALIDATE) 収集後に共有プール上の実行計画が正しくなくなる ディクショナリもデフォルトで収集される 47

オプティマイザ統計統計収集 ( 自動オプティマイザ統計収集 ) デフォルトで収集しないものがあるので注意 拡張統計 列グループ統計 式の統計 固定オブジェクト 動的パフォーマンス ビュー (v$ ビュー ) の実表 (x$ 表 ) アプリケーションの変更やデータベース構成の変更の時に手動で再収集する DBMS_STATS.GATHER_FIXED_OBJECTS_STATS; AWR や Statspack でも使用されているので 取得に時間が掛るような時も 一時表 (Global Temporary Table) 正しく収集できないので動的サンプリングを使用する 12c からセッション固有統計が提供されたので手動でも収集しやすくなった <= 第 35 回 48

オプティマイザ統計統計の補正 動的サンプリング (11g まで ) 11gR2 からパラレル実行時にレベルを自動決定 ( 大きな表 複雑な WHERE 句 ) カーディナリティ フィードバック (11g まで ) 見積りと実行時の統計が大きく異なると記録して 2 回目から使用する 適応問合せ最適化 (Adaptive Query Optimization)<=12c から ( 第 33 回 ) 適応計画 (Adaptive Plans) 実行時の最適化 結合方法 (Join Methods) パラレル分散方法 (Parallel Distribution Methods) 適応統計 (Adaptive Statistics) 次回実行時以降の最適化 動的統計 (Dynamic Statistics) 自動再最適化 (Automatic Reoptimization) SQL 計画ディレクティブ (SQL Plan Directives) <= 第 52 回 49

オプティマイザ統計統計の補正 ( 適応問合せ最適化 ) SQL 文実行時に統計が不十分な場合の動作 SQL 文の実行 ( 初回 ) 適用計画 実行時統計のメモリ上への保存 SQL 計画ディレクティブの作成 カーソルが残っている場合 同じ SQL 文の実行 カーソルがエージアウトなどで存在しない場合 自動再最適化 (statistics feedback) を実施 ディレクティブにより動的統計の収集を実施 統計収集 (dbms_stats) SQL 計画ディレクティブから収集データを追加 ( 使用しない ) 50

最後に AWR は DB Time ベースで解析 まずは Report Summary から SQL チューニングは基本的なレベルから BI ツールなどの SQL 自動生成ツールに注意 オプティマイザ統計は必要なものを正しく設定する 限界があることも忘れずに よろしければ 津島博士のパフォーマンス講座 を読んでみてください 51

Safe Harbor Statement The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle s products remains at the sole discretion of Oracle. 52

53

54