連載
» 2017年08月09日 05時00分 UPDATE

しばちょう先生の試して納得! DBAへの道(改)(4):「高度なSQL実行計画の取得」を実践する (1/3)

データベース技術や知識は、座学だけでなく「実際に手を動かして、実際に試して」理解を深めよう──。日本オラクルのデータベーススペシャリストが「新人をDBAに育てる際に使用する課題」をベースに、DBAがすぐ実践できる即効テクニックを紹介。今回は「高度なSQL実行計画を正しく取得するテクニック」を解説します。

[柴田長,日本オラクル株式会社]
※本連載は、日本オラクルの技術解説ブログ「Oracle Technology Network:しばちょう先生の試して納得!DBAへの道」より、提供者の許可の下、最新情報の追記とともに一部改訂して転載するものです。

連載バックナンバー

photo

 皆さんこんにちは。日本オラクルの“しばちょう”こと、柴田長(しばたつかさ)です。

 今回は、これまで解説してきたSQLの実行計画の取得方法よりもさらに高度な方法を2つ体験してみましょう。

 いざというときに、今回紹介するようなコマンドをスラスラと入力して解決できると、以降、周囲から尊敬のまなざしで見られること間違いなしです。もちろん分析もできなければなりませんが、まずはコマンドを自分の指に記憶させてみてくださいね。

 早速、第3回の演習を実行した直後のデータベース環境で、以下の演習にチャレンジしてみてください。

演習1:「dbms_xplan.display_cursor」ファンクションで特定SQLの実行計画を表示する

 「SQL*Plus」から「TRY」ユーザーでデータベースに接続し、「dbms_xplan.display_cursor」ファンクションを使用して、第3回の演習2『SELECT文にコメントを追加して実行する』で実行したSELECT文(SQL_ID=2vrywhbx1jxtb, CHILD_NUMBER=0)の実行計画を表示させます。

$ sqlplus / as sysdba
SQL>
set linesize 100 pagesize 100
select * from table(DBMS_XPLAN.DISPLAY_CURSOR('2vrywhbx1jxtb', 0));
 
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------
SQL_ID  2vrywhbx1jxtb, child number 0
-------------------------------------
select /* practiceSQL1 */ COL1 || ' : ' || COL2 "Record" from TBL2
where ROWNUM <=3
 
Plan hash value: 2810601966
 
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |     4 (100)|          |
|*  1 |  COUNT STOPKEY     |      |       |       |            |          |
|   2 |   TABLE ACCESS FULL| TBL2 |   920K|    57M|     4  (50)| 00:00:01 |
---------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter(ROWNUM<=3)
 
Note
-----
   - dynamic sampling used for this statement (level=2)

 「dbms_xplan.display_cursor」ファンクションは第2回の演習5『「dbms_xplan.display_cursor」ファンクションで原因を追及する』でも紹介しましたが、その際には実行計画の取得対象のSELECT文を実行した直後に引数なしの状態で「dbms_xplan.display_cursor」ファンクションを実行していました。今回はSQL_IDCHILD_NUMBERを引数に設定することで、直前に対象のSELECT文を実行していない場合でも実行計画を取得できることを体験していただきました。設定すべきSQL_IDとCHILD_NUMBERの値については、第3回の演習3『V$SQLビューでSQL_IDとCHILD_NUMBERを確認する』で確認済みですね。

 なお、各種PL/SQLパッケージのプロシージャやファンクションの詳細は、マニュアル「PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス」に記載されています。「DBMS_XPALNパッケージのDISPLAY_CURSORファンクション」の項を参照してください。大抵の場合、構文、パラメーター、使用上の注意、例が記載されています。特にこのファンクションの「format」パラメーターの指定の仕方次第では、さまざまな情報を出力させることが可能です。ぜひいろいろと試してみてください。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。