LIKEまたは複合索引で先頭列を指定しない後方一致条件(中間一致条件)のSQL文では索引は使用されません。例えば、テーブル tab1に列c1,c2の複合索引(複数列索引)と列c3の索引が作成されていたとすると、以下のようなSQL文では索引は使用されません。これは、大小比較でデータを絞り込んでいくので先頭が決まらないと絞り込めないためです。, ただし、これも索引の数が増えてしまい、更新時のオーバーヘッドが増加してしまいます。Oracle9iからは「索引スキップ・スキャン」機能により索引を使用するようになりましたので、このような索引を作成する必要がありません。ただし、前方一致条件よりは効率は悪いので注意して下さい(できるだけ高速にしたい処理には前方一致条件による索引アクセスにして下さい)。, 索引スキップ・スキャンについて Oracle SQL パフォーマンス. (1)INとEXISTSについて コストベース・オプティマイザ採用のOracle11gでオプティマイザ・ヒントを用いて、「from句の順番=Oracleが検索するテーブルの順番」によって、パフォーマンスにどれくらいの違いが出るのかを検証します。, Oracleのオプティマイザは、データベースへの問い合わせ時にデータに対して最適なアクセス方法を考えてくれる機能です。その種類として、前述しました「ルールベース・オプティマイザ」と「コストベース・オプティマイザ」についても少し触れておきます。, Oracle10g以降はサポートされていないとはいえ、初期化パラメータ次第ではまだRBOを利用できるので、利用しているところは多いかもしれません。 ・テーブル結合を含むSELECT文の実行時間を計測 sqlのコーディング方法を統一して、キャッシュ上で共有されるようにしましょう。 下記4つのSQLは、処理内容は同じですが、それぞれ、メモリ上にキャッシュされ、再利用されません。 今回は、詳しく聞きたいというご要望のありました「パフォーマンスの良いSQL文ついて」まとめて説明しようと思います。すべてのパターンについて解説はできませんが、第4回で少し説明した実行計画を使用して説明しますので、実行計画などを見るときの参考にもして下さい。 SQL文の見直し. まずは生成データを下記の通り設定しました。 Sign in|Recent Site Activity|Report Abuse|Print Page|Powered By Google Sites, 処理内容が同じSQLでも、大文字/小文字/空白や改行の数が異なると、別々にキャッシュされてしまい、解析済みのSQLが共有されなくなるので、その分パフォーマンスが低下する。, 下記4つのSQLは、処理内容は同じですが、それぞれ、メモリ上にキャッシュされ、再利用されません。, SQLで、変数の値を設定する場合は、バインド変数を使用することによって、SQLが共有されます。, ※バインド変数の指定方法は、JAVA、SQLPLUS、ProCなど実行環境で異なる, 」を使用すれば、大文字/小文字/空白や改行の数を統一や、バインド変数を使用しなくても、, SELECTで*を使用すると、解析/IOともにパフォーマンスが低下するので、必要な項目のみ指定します。, 但し、COUNT(列名)は、指定した列がNULLの場合は、カウントしないので、プライマリキー項目などのNOT NULL列を指定する。, BETWEENは、指定された範囲評価の操作が1回で済むのに対し、ANDは複数回の操作となるので、ANDよりBETWEENの使用を検討する, HAVINGは非常に重い処理なので、集計結果の判定以外は、HAVING句よりWHERE句の使用を検討する。, UNIONはSELECTの結果をマージした後に、暗黙のソート処理をして重複データを排除しますが、重複データが無いことが分かっている場合は、暗黙のソート処理を回避するために、UNION ALLを使用する, や、GROUP BY、INTERSEST、MINUS等にも暗黙のソート処理が実行されるので、極力使用を避けた方が良い。, ROWIDとは、データベース内のレコードのアドレスを表すOracleの内部的な管理情報です。, その為、WHERE句にROWIDを使用すると、テーブルのレコードに最速でアクセスできます。, 但し、Export/Importや表の移動(alter table moveコマンド)などでROWIDは変更されてしまう為、ROWIDの使用は、SELECTでデータを取得後に再度アクセスする場合などに限定されます。, ORDER BY句に列番号で指定した場合、SQL解析時に読み替え処理が発生するのでパフォーマンス低下に繋がる, DISTINCTは、条件に一致するレコードを取り出し暗黙のソート処理後に重複レコードを排除することに対し、EXISTS句は条件に一致するレコード1件でもあればそこで処理は終了する為、暗黙のソート処理をしない分、DISTINCTに比べると負荷が小さくなる, 、INTERSEST、MINUS等は暗黙のソート処理が実行されるので、極力使用を避けた方が良い。, NOT IN句は、内部的にソートマージの結合をすることでテーブルをフルスキャンするのに対し、NOT EXISTS句は条件に一致するレコード1件でもあればそこで処理は終了する為、NOT IN句に比べると負荷が小さくなる, Bツリー・インデックスの中にはNULL値は存在しないので、WHERE句に「IS NULL」を指定するとINDEXは使用されない。, ORDER BY 句で指定する項目は、全てINDEXに含まれ、かつ、NOT NULL項目の場合は、高速にソートされます。, WHERE句で指定した、列の型とデータの型が異なる場合、ORACLEは自動的に型変換を実行するが、型を自動変換する場合はINDEXが使用されない。, ● ORDER BY句の指定列が全てINDEXに指定ないと、ソートにINDEXが使用されない. ・100000件 「コストベース・オプティマイザ」 → 「CBO」, 今回は格納されているデータ件数の異なるテーブルを用意し、そのテーブルを結合するSQL文の実行時間を、from句の指定順番を変えながら計測します。, ・サンプルテーブルにそれぞれ100件、100万件のデータを作成 データベース診断 … ・CBOの場合はアクセス順が変わらない場合がある(オプティマイザの判断), 今回の検証では、オプティマイザ・ヒントを利用して「from句の順番=アクセスする順番」が変わることで、パフォーマンスに違いが出ることが確認できました。 ・一回の検証ごとにテーブルデータを削除し、DBバッファキャッシュをクリア db2batchとは?SQLスクリプトを実行し、計測結果を出力するツール。スクリプト内にメタ情報を設定することで、様々な条件でパフォーマンスを計測できる優れもの。基本的なdb2batchの使い方サンプル簡単なSQLスクリプトファイルを作って、db2batchで実行させてみる。 Buffer pool 5G 4385.18 5.5% 33% Buffer pool 30G (All data in cache) 36784.76 36% 8% アクセス頻度の高いデータをメモリに格納 • DBT-2 ベンチマーク (更新処理が多数) • 20-25GBの”ホット”なデータ (200 warehouses, 1時間実行) • Nehalem 2.93GHz x 8 cores, MySQL 5.5.2, 4 RAID1+0 HDDs (2)列を演算(関数を使用)している ルールに従うという所が見えやすくて分かりやすいからですかね。, ※以降の表記は下記の通り省略します。 ・1000件 テーブルを結合するようなSQLを実行する際、パフォーマンスを考慮しfrom句で指定するテーブルの順番を考え直すといった場面があるかと思います。 今回はデータ件数の異なるテーブルを結合条件に指定した場合に、from句で指定するテーブルの順番によって、パフォーマンスにどれくらいの違いが出るのか検証します。 また、対象のデータベースは「Oracle」とします。 と、ここまで説明してご存知の方からはすぐに、「Oracleのバージョンやオプティマイザの種類によって結果が異なるのではないか。 … Gold DBA のセミナー、Oracle Certified... 津島博士のパフォーマンス講座 Indexページ ▶▶ ○ select * from dept where dept_id = :dept_id; ○ select * from emp where salary between 0 and 3000; × select dept_id, sum( salary ) from emp group by dept_id having dept_id = 'D02'; ○ select a.emp_id, a.emp_name from emp a; ○ select a.emp_id, a.emp_name from emp a order by salary; × select distinct a.emp_id, a.dept_id from emp a,dept b, × select distinct a.emp_id, a.dept_id from emp a. ステム モニター (perfmon とも呼ばれます) を使用して、パフォーマンス カウンターで, Using System Monitor (also known as perfmon) to measure the performance of, すべてのページ フィードバックを表示, エンタープライズ全体の管理の自動化, Automated Administration Across an Enterprise, 以前のバージョンのドキュメント. 今回はデータ件数の異なるテーブルを結合条件に指定した場合に、from句で指定するテーブルの順番によって、パフォーマンスにどれくらいの違いが出るのか検証します。 Oracle University 無償オンラインセミナー(11月) Security Zones"を翻訳した... CAPTCHA challenge response provided was incorrect. ・それぞれ5回実施し、平均時間を採用する テーブルを結合するようなSQLを実行する際、パフォーマンスを考慮しfrom句で指定するテーブルの順番を考え直すといった場面があるかと思います。 More than 3 years have passed since last update. 皆さんこんにちは、まだまだ暑いですが体調はいかがでしょうか。私はどうにか頑張っております。 (1)NULL比較やNOT(!=)を使用している Bツリー索引では、NULL値は格納されていませんのでNULL比較(IS NULL、IS NOT NULL)をWHERE句の条件に指定すると索引は使用されせん。また、NOT(!=、<>なども)を使用した場合も索引は使用されません。これは、指定した条件に一致しないものを求めることになるため、フルスキャンの方が速いという判断からです。そのため、NULL比較をしなくても良いようにNULL値に意味を持たせないようにして下さい。また、NOTは別の条件に変えることを検討して下さい(例えば、INやORに置き換えるなどです。ただし、「(4)INリストまたはORを使用している」で説明しているように、値指定が多くなると効率が悪くなるので、注意して下さい)。できれば使用しなくても良いように設計して下さい。 ョンの設定 (SQL Server Profiler), Set Global Trace Options (SQL Server Profiler), トレース ファイルに含めるイベントとデータ列の指定 (SQL Server Profiler), Specify Events and Data Columns for a Trace File (SQL Server Profiler), トレースを実行するための Transact-SQL スクリプトの作成 (SQL Server Profiler), Create a Transact-SQL Script for Running a Trace (SQL Server Profiler), トレース結果のファイルへの保存 (SQL Server Profiler), Save Trace Results to a File (SQL Server Profiler), トレース ファイルの最大ファイル サイズの設定 (SQL Server Profiler), Set a Maximum File Size for a Trace File (SQL Server Profiler), トレース結果のテーブルへの保存 (SQL Server Profiler), Save Trace Results to a Table (SQL Server Profiler), トレース テーブルの最大テーブル サイズの設定 (SQL Server Profiler), Set a Maximum Table Size for a Trace Table (SQL Server Profiler), トレース内のイベントへのフィルターの適用 (SQL Server Profiler), Filter Events in a Trace (SQL Server Profiler), フィルター情報の表示 (SQL Server Profiler), View Filter Information (SQL Server Profiler), フィルターの変更 (SQL Server Profiler), イベントの開始時刻に基づいたイベントのフィルター選択 (SQL Server Profiler), Filter Events Based on the Event Start Time (SQL Server Profiler), イベントの終了時刻に基づいたフィルターでのイベントの選択 (SQL Server Profiler), Filter Events Based on the Event End Time (SQL Server Profiler), トレースでのサーバー プロセス ID (SPIDs) のフィルター選択 (SQL Server Profiler), Filter Server Process IDs (SPIDs) in a Trace (SQL Server Profiler), トレースに表示される列の構成 (SQL Server Profiler), Organize Columns Displayed in a Trace (SQL Server Profiler), SQL Server Profiler を使用してトレースを開始、一時停止、および停止するには, To start, pause, and stop traces by using SQL Server Profiler, サーバーへの接続後の自動的なトレースの開始 (SQL Server Profiler), Start a Trace Automatically after Connecting to a Server (SQL Server Profiler), トレースの一時停止 (SQL Server Profiler), トレースの停止 (SQL Server Profiler), 一時停止または停止したトレースの再開 (SQL Server Profiler), Run a Trace After It Has Been Paused or Stopped (SQL Server Profiler), SQL Server Profiler を使用してトレースを開き、トレースの表示方法を構成するには, To open traces and configure how traces are displayed by using SQL Server Profiler, トレース ファイルを開く (SQL Server Profiler), トレース テーブルを開く (SQL Server Profiler), トレース ウィンドウの消去 (SQL Server Profiler), Clear a Trace Window (SQL Server Profiler), トレース ウィンドウを閉じる (SQL Server Profiler), Close a Trace Window (SQL Server Profiler), トレース定義の既定値の設定 (SQL Server Profiler), Set Trace Definition Defaults (SQL Server Profiler), トレース表示の既定値の設定 (SQL Server Profiler), Set Trace Display Defaults (SQL Server Profiler), SQL Server Profiler を使用してトレースを再生するには, To replay traces by using SQL Server Profiler, トレース ファイルを再生する (SQL Server Profiler), Replay a Trace File (SQL Server Profiler), トレース テーブルを再生する (SQL Server Profiler), Replay a Trace Table (SQL Server Profiler), 一度に単一のイベントの再生 (SQL Server Profiler), Replay a Single Event at a Time (SQL Server Profiler), ブレークポイントまでの再生 (SQL Server Profiler), Replay to a Breakpoint (SQL Server Profiler), カーソルまでの再生 (SQL Server Profiler), Transact-SQL スクリプトの再生 (SQL Server Profiler), Replay a Transact-SQL Script (SQL Server Profiler), SQL Server Profiler を使用してトレース テンプレートを作成、変更、および使用するには, To create, modify, and use trace templates by using SQL Server Profiler, トレース テンプレートの作成 (SQL Server Profiler), Create a Trace Template (SQL Server Profiler), トレース テンプレートの変更 (SQL Server Profiler), Modify a Trace Template (SQL Server Profiler), 実行中のトレースからのテンプレートの作成 (SQL Server Profiler), Derive a Template from a Running Trace (SQL Server Profiler), トレース ファイルまたはトレース テーブルからのテンプレートの作成 (SQL Server Profiler), Derive a Template from a Trace File or Trace Table (SQL Server Profiler), トレース テンプレートのエクスポート (SQL Server Profiler), Export a Trace Template (SQL Server Profiler), トレース テンプレートのインポート (SQL Server Profiler), Import a Trace Template (SQL Server Profiler), SQL Server Profiler トレースを使用してサーバーのパフォーマンスを収集および監視するには, To use SQL Server Profiler traces to collect and monitor server performance, トレース中の値列またはデータ列の検索 (SQL Server Profiler), Find a Value or Data Column While Tracing (SQL Server Profiler), Deadlock Graph の保存 (SQL Server Profiler), Save Deadlock Graphs (SQL Server Profiler), Showplan XML イベントを個別に保存する方法 (SQL Server Profiler), Save Showplan XML Events Separately (SQL Server Profiler), Showplan XML Statistics Profile イベントを個別に保存 (SQL Server Profiler), Save Showplan XML Statistics Profile Events Separately (SQL Server Profiler), トレースからのスクリプトの抽出 (SQL Server Profiler), Extract a Script from a Trace (SQL Server Profiler), トレースと Windows パフォーマンス ログ データの関連付け (SQL Server Profiler), Correlate a Trace with Windows Performance Log Data (SQL Server Profiler), すべてのページ フィードバックを表示, クイック スタート:SQL Server 拡張イベント, 以前のバージョンのドキュメント.