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

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

PA4

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

Oracle Database In-Memory 高可用性ベスト・プラクティス

スライド 1

MaxGauge_診断分析プロセス

Oracle Database 11g Oracle Real Application Testing

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

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

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

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

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

10年オンプレで運用したmixiをAWSに移行した10の理由

Oracle XML DB によるスケーラビリティおよびパフォーマンス検証 - MML v.3.0

プレポスト【問題】

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

機能紹介:コンテキスト分析エンジン

Slide 1

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

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

Oracle Data Pumpのパラレル機能

PowerPoint プレゼンテーション

6回目

White Paper 高速部分画像検索キット(FPGA アクセラレーション)

自己管理型データベース: 自動SGAメモリー管理

— intra-mart Accel Platform セットアップガイド (WebSphere編)   第7版  

Microsoft Word - JDBCドラバーの設定.doc

IBM Cloud Social Visual Guidelines

サーババンドル版ライセンス NX7700x シリーズ Express5800 シリーズのサーバと同時に購入することで パッケージ製品よりも安価 に導入することのできるライセンスも提供しています ライセンスの注意事項 サーババンドル版のライセンスについてサーババンドル版では 通常のサーバライセンスおよ

この方法では, 複数のアドレスが同じインデックスに対応づけられる可能性があるため, キャッシュラインのコピーと書き戻しが交互に起きる性のミスが発生する可能性がある. これを回避するために考案されたのが, 連想メモリアクセスができる形キャッシュである. この方式は, キャッシュに余裕がある限り主記憶の

ライセンスの注意事項 サーババンドル版のライセンスについてサーババンドル版では 通常のサーバライセンスおよび 4 コアライセンスを ベースライセンス 追加サーバライセンスおよび追加 2 コアライセンスを 追加ライセンス と呼びます 1 台の物理サーバに対してベースライセンスは 1 つしか購入すること


Exam : 1z0-882 日本語 (JPN) Title : Oracle Certified Professional, MySQL 5.6 Developer Vendor : Oracle Version : DEMO 1 / 4 Get Latest & Valid 1z0-882-JP

ICDE’15 勉強会 R24-4: R27-3 (R24:Query Processing 3, R27 Indexing)

Enterprise Cloud + 紹介資料

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

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

Oracle Database 12c

Microsoft Word - nvsi_050090jp_oracle10g_vlm.doc

Oracle Tuning Pack

ライセンスの注意事項 サーババンドル版のライセンスについてサーババンドル版では 通常のサーバライセンスおよび 4 コアライセンスを ベースライセンス 追加サーバライセンスおよび追加 2 コアライセンスを 追加ライセンス と呼びます 1 台の物理サーバに対してベースライセンスは 1 つしか購入すること

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

Oracle Real Application Clusters 10g Release 2: Microsoft SQL Server 2005との技術的比較

PowerPoint Presentation

PowerPoint プレゼンテーション

PowerPoint Presentation


SQL インジェクションの脆弱性

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


IBM Presentations: Smart Planet Template

NOSiDEパンフレット


Visual Basic Oracle Database 11 Release 1

Slide 1

意外と簡単!? AccessからOracle ~Oracleデータベースでシステムはもっと快適になる~

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

2. バージョンアップ内容 intra-mart WebPlatform/AppFramework Ver.7.1 および Ver.7.2 に対応いたしました SAP JCo 3.0.x に対応いたしました 3. 製品概要 IM-ERP リアルコネクトは SAP システム内のデータをリアルタイムに取

PHP 開発ツール Zend Studio PHP アフ リケーションサーハ ー Zend Server OSC Tokyo/Spring /02/28 株式会社イグアスソリューション事業部

Oracle Database 監視製品の使い分け 2017 年 10 月日本電気株式会社クラウドプラットフォーム事業部 CLUSTERPROグループ

PowerPoint プレゼンテーション

慶應義塾大学大学院経営管理研究科修士課程 学位論文 2011 年度 論文題名 美人投票の経済学 - 外国為替変動メカニズムの再考 - 主査 小幡績准教授 副査 渡辺直登教授 副査 井上光太郎准教授 副査 2012 年 3 月 1 日提出 学籍番号 氏名徐佳銘



m

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

スライド 1

intra-mart Accel Platform

外為オンライン FX 取引 操作説明書

1 2

untitled

INDEX

INDEX


1002goody_bk_作業用

*p _Œâ‡í‡ê‡é

2 of :30 PM

広報かわぐち 2005年2月号

研究紀要 第14号 (研究ノート1)

untitled

FUJITSU Software Systemwalker for Oracle V15 (15.1) 紹介資料

SISJIN


2

2


2

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

自己管理データベース: 自動SGAメモリー管理

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

PowerPoint Presentation

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

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

Windows Server2003環境向け Deep Security 推奨ポリシーの考え方 と適用イメージ

Corp ENT 3C PPT Template Title

Oracle Text 概要

プロジェクトマネジメント知識体系ガイド (PMBOK ガイド ) 第 6 版 訂正表 - 第 3 刷り 注 : 次の正誤表は PMBOK ガイド第 6 版 の第 1 刷りと第 2 刷りに関するものです 本 ( または PDF) の印刷部数を確認するには 著作権ページ ( 通知ページおよび目次の前 )

自己紹介 氏縄武尊 (Ujinawa Takeru) Work 株式会社オージス総研テミストラクトソリューション部 3 年目 ID 管理 認証周りの開発 OpenID Connect, AWS Private 滋賀県彦根市出身 Copyright 2016 OGIS-

Oracle Real Application Clusters 10g: 第4世代

winras.pdf

Transcription:

バッチ処理にバインド変数はもうやめません? ~ バッチ処理の突発遅延を題材にして考えてみる ~ 2012/4/6 株式会社コーソル渡部亮太

今日お伝えしたいこと バッチ処理 SQL を バインド変数化するの はやめませんか? OLTP 処理 SQL はバインド変数化して OK なんだけどね

自己紹介 + 所属企業の紹介 渡部亮太 ( わたべりょうた ) SE PM を経験後 Oracle Database のエキスパートを目指して転職 執筆 プロとしての Oracle アーキテクチャ入門 プロとしての Oracle 運用管理入門 講演 Developers Summit 2009 Oracle LOVERS シーズン 2 第 2 回 Oracle DBA & Developer Days 2010, 2011 株式会社コーソル CO-Solutions= 共に解決する の理念のもと Oracle 技術に特化した事業を展開中 心あるサービスの提供とデータベースエンジニアの育成に注力している 社員数 : 98 名 ( エンジニアのほぼ全員が Oracle Master 所有者 )

こんな現象を題材に考えます 稼動実績があるバッチ処理が 突然パフォーマンスダウンするケース 突然 SQL のパフォーマンスがダウン バインド変数を使用した SQL 試行錯誤していろいろ対処策を探っているうちに なぜか通常のパフォーマンスに戻った しかし その後も不定期にパフォーマンスダウンが再発 原因がつかめない

正常稼働時 範囲検索条件をバインド変数化した SQL 数は比較的少ない INDEX RANGE SCAN が適切と想定される SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 1 10 :

パフォーマンスダウン時 TABLE FULL SCAN が実行されている しかし 現場的には実行計画の変化に気づいていない 不要なブロックアクセスが大量に発生 SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 1 10 :

問題発生のメカニズム なぜこのような現象が発生するのか? 以下の 2 つの動作が影響している 1) バインドピーク機能 ハードパース時に指定されたバインド変数値を元に実行計画を作成する機能 2) 共有カーソル ( 子カーソル ) の再利用 作成済みの共有カーソルが共有プールに存在する場合 2 回目以降の SQL 実行で再利用する仕組み 共有カーソルには実行計画が含まれるため 実行計画も再利用される

初回実行 SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 1 10 ハードパース バインド変数値 sval = 1 eval = 10 を元に実行計画を作成 実行 & フェッチ 共有プール :

2 回目以降の実行 SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 11 20 ソフトパース 実行 & フェッチ 作成済み実行計画を流用 共有プール :

共有カーソルの age-out 共有プールの領域不足 統計情報の更新など様々な理由で共有カーソルは age-out される場合がある 共有プール

(age-out 後の ) 初回実行 SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 100 5000 注目 ハードパース バインド変数値 sval = 100 eval = 5000 を元に実行計画を作成 実行 & フェッチ 共有プール :

(age-out 後の ) 2 回目以降の実行 SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 1 10 ソフトパース 実行 & フェッチ 作成済み実行計画を流用 共有プール : 非効率な SQL 実行!

混乱した現場が 共有プールの強制 flush 統計情報の再収集 インスタンスの再起動などを実行すると 共有カーソルの age-out 相当の処理が実行される形になる ハードパースが再実行され 想定通りの実行計画となる ( 問題のメカニズムが分かっていれば 上記の動作は当たり前の話なのだが ) 現場的には なぜかよくわからないが問題が解消したように見える が 以後も偶発的に同様の現象が発生

対処策は? 対処策 SQL をリテラル ( バインド変数を使用しない ) に修正 バインドピークを無効化 (_optim_peek_user _binds=false) 実行計画を誘導 ( ヒント アウトライン SQL 実行計画管理 ) 説明 リテラル値 ( WHERE 条件 ) 毎に実行計画を作成 異なる WHERE 条件が指定された SQL に対して 1 つの実行計画を使いまわさないようになる デフォルト値を基準に実行計画を作成する 実行計画がバインド変数値に依存しないようになる 指定した実行計画が作成される 実行計画がバインド変数値に依存しないようになる

対処策 1) SQL をリテラルに修正 WHERE 条件ごとに実行計画が作成される 子カーソル ( 実行計画 ) が共有されない 個々の WHERE 条件に最適な実行計画が作成される SELECT * FROM tbl0 WHERE 1 < val AND val < 10 SELECT * FROM tbl0 WHERE 100 < val AND val < 5000 :

対処策 2) バインドピークを無効化 _optim_peek_user_binds=false デフォルト値 (*1) を基準に実行計画が作成される 子カーソル ( 実行計画 ) が共有される ある意味 平均的な実行計画が作成される SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 1 10 SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 100 5000 : (*1) デフォルト値の例 '=', 'LIKE' の選択率 : 1/NUM_DISTINCT そのほかの選択率 : 0.05

対処策 3) 実行計画を誘導 指定した実行計画が作成される 子カーソル ( 実行計画 ) が共有される どの実行計画に誘導するか? という問題が残る SELECT /*+INDEX(tbl0) */ * FROM tbl0 WHERE :sval < val AND val < :eval 1 10 SELECT /*+INDEX(tbl0) */ * FROM tbl0 WHERE :sval < val AND val < :eval 100 5000 :

そもそも論 で考える そもそも SQL をバインド変数化する目的とは? バインド変数化するメリット デメリット バインド変数化が ある意味 盲目的に推奨されている背景 そもそも 実行計画の共有 / 非共有が するかしないかの 2 択 なのはいかがなものか もう少し賢い仕組みがあってしかるべきでは というわけで Adaptive Cursor Sharing (11.1-)

そもそも論 で考える そもそも SQL をバインド変数化する目的とは? バインド変数化するメリット デメリット バインド変数化が ある意味 盲目的に推奨されている背景 そもそも 実行計画の共有 / 非共有が するかしないかの 2 択 なのはいかがなものか もう少し賢い仕組みがあってしかるべきでは というわけで Adaptive Cursor Sharing (11.1-)

バインド変数化のメリット デメリット / 案 ハードパース実行回数の削減による CPU 使用率の削減 説明 異なる WHERE 条件を指定した多くの SQL が発行される場合は効果大 共有プール使用量の削減 異なるWHERE 条件を指 定した多くのSQLが発行さ れる場合は効果大 WHERE 条件により最適な実行計画が異なる場合でも同一の実行計画を使用 どのような WHERE 条件でも最適な実行計画が同じ場合は問題とならない

バッチ処理 SQL とバインド変数化 / 案 ハードパース実行回数の削減による CPU 使用率の削減 バッチ処理 SQL の場合 異なる WHERE 条件を指定した多くの SQL が発行されないため 効果小 共有プール使用量の削減 異なるWHERE 条件を指 定した多くのSQLが発行さ れないため 効果小 WHERE 条件により最適な実行計画が異なる場合でも同一の実行計画を使用 WHERE 条件により最適な実行計画が異なる場合が多い バインド変数化の利点は バッチ処理 SQL の特性に適合しない

バインド変数化を盲目的に推奨する風潮? バインド変数化の有無は 開発者がそれぞれの SQL ごとに判断する必要がある 現在の Oracle Database では 残念ながら しかし 盲目的に バインド変数化 = 善 と判断している風潮が見られる コーディング規約でのルール化 DB アクセスロジックを過度に共通化 突発的なパフォーマンスダウンを避けるため 盲目的にバインド変数を使用することは避けてほしい

そもそも論 で考える そもそも SQL をバインド変数化する目的とは? バインド変数化するメリット デメリット バインド変数化が ある意味 盲目的に推奨されている背景 そもそも 実行計画の共有 / 非共有が するかしないかの 2 択 なのはいかがなものか もう少し賢い仕組みがあってしかるべきでは というわけで Adaptive Cursor Sharing (11.1-)

実行計画の共有 / 非共有の判断 WHERE 条件が異なる SQL と実行計画の共有 / 非共有 n の SQL について 1 つの実行計画を共有するか n の SQL についてそれぞれ n の実行計画を作成する 実行計画を共有するかしないか そもそも もうすこしインテリジェントな仕組みがあっても良いのでは?

Adaptive Cursor Sharing (11.1-) 作成済みの実行計画 ( 子カーソル ) が不適切な場合は 自動的に新規に子カーソルを作成する機能 SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 1 SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 100 SELECT * FROM tbl0 WHERE :sval < val AND val < :eval 100 10 1 5000 2 5000 1 2 :

Adaptive Cursor Sharing で万事 OK? 残念ながらそんなことはない Feedback-Base なので 最低 1 回は痛い目にあわないとダメ ( 実行イメージ ) 作成済みの実行計画で実行 ( パフォーマンスダウン +) 予測値と実測値に乖離 新規に実行計画を作成 ( 大量データを処理する ) バッチ処理の場合 痛い目にあってからでは遅い したがって バッチ処理の場合は SQL のリテラル化がやっぱりオススメ

ご参加いただきありがとうございました ひきつづき鼓動をお楽しみください

中間的な特性を持つ SQL では? バッチ処理と OLTP の中間的な特性を持つ SQL では どういうアプローチが適切か WHERE 条件により最適な実行計画が異なる 実行頻度はそれなりに高い 条件の種類も多い 対処策 たまに発生する実行計画の作成ミスには目をつぶり ACS に頼る 最適な実行計画が異なるバインド変数値を洗い出し その場合のみリテラル化 or 実行計画を誘導 ( それなりに大変なはず )

CURSOR_SHARING=SIMILAR CURSOR_SHARING リテラル SQL を自動的にバインド変数化する機能 CURSOR_SHARING=SIMILAR SQL の種類とオプティマイザ統計の取得状況が条件に合致する場合 WHERE 条件毎に別の子カーソル ( 実行計画 ) を作成する 意図しない実行計画の共有を回避できる反面 子カーソル数の肥大化を招く場合があるため 適用は慎重に 11.2 以降で非推奨 11.2.0.3 で使用不可