12c Database App Development VMを使ってみた

このエントリは JPOUG Advent Calendar 2014 4日目のエントリです。
昨日のエントリは charade_oo4oさんの 「[JPOUG Advent Calendar] Oracle on Hyper-V 2014」でした。

Oracle Database導入済みのVirtualBox VMイメージを使って、簡単にOracle Databaseを使い始めてみましょう! という方向のエントリを書こうと思っていたのですが・・・・

オラクル社が公開しているVMイメージが、どれも初心者には不適切なものばかりだったので、当初の狙いから変え、Database App Development VM についていくつか導入方法といくつか注意点をまとめる内容にします・・・。残念。

オラクル社が公開している製品導入済みVirtualBox VMイメージ

にて、Oracle Databaseをはじめとする、様々な製品がインストールされたVMイメージが公開されています。

2014/12/03 時点で、XEでないOracle DatabaseがインストールされたVMイメージは
以下の通りです。


  • MySQL and Oracle Enterprise Manager Developer VM
  • Oracle Data Integrator 12c VM
  • Oracle Big Data Lite VM
  • Database App Development VM

残念ながら、どのVMも、Oracle Databaseを気軽に試す・・ という目的には一長一短です。
(よいVMがあればこれをもとにエントリを書こうと、1つ1つ確認したのですが・・・残念)

MySQL and Oracle Enterprise Manager Developer VM

Contentsに Oracle Database 11g (for Linux x86-64) が記載されていますが、
これは、OEMのリポジトリDBとしてOracle Databaseを使用しているということでした。

Oracle Databaseの学習用には不適切ですし、VMイメージのサイズが 17GBときわめて大きいため
取り回しにくいです。

Oracle Data Integrator 12c VM

Oracle Data Integrator と Oracle GoldenGate を使用することを想定したVMです。
Oracle Databaseの学習用には不適切です。

Oracle Big Data Lite VM

Oracle Big Data Appliance に含まれるソフトウェア群で構成した
Oracle Big Data Appliance を模したVMイメージです。
Oracle Databaseの学習用には不適切です。

Database App Development VM


後述

Database App Development VMについて

Oracle Database を用いたアプリケーション開発を想定したVMであり、
これらの中では最もOracle Databaseの学習用には適切・・・なはずですが、
Oracle Databaseを気軽に試す・・ という目的に対しては、いろいろと課題があります。


  • OSがなぜかOracle Linux 7
  • データベースがマルチテナント
  • いにしえの環境変数の罠

課題のレベル感はさまざまですが、使用するまでの手順に説明しながら、課題への対処策と併せてみてゆきたいと思います。

Database App Development VMをダウンロードする

まず、

  • Oracle Technology Network Developer Day

    から、Database App Development VMのovaファイル Oracle_DB_Developer_VM_new.ova をダウンロードします。ovaファイルはVMイメージの標準フォーマットです。
    また、ダウンロードには、ライセンス規約を受け入れること、オラクルのアカウントでログインすることが必要です。

    ova形式のVMイメージをVirtualBoxにインポートする

    上記の作業で得られた Oracle_DB_Developer_VM_new.ova をVirtualBoxにインポートします。




    インポートが完了すると Oracle DB Developer VM という名称のVMが構成されます。

    起動前にいくつかVMの設定を修正しておくことをお勧めします。

    まず、マシンのメモリサイズに併せて、VMに割り当てるメモリサイズを調整しておきましょう。

    また、VMのネットワーク構成を調整してもよいかもしれません。
    VMのネットワーク構成は各自の好みや制約の部分もありますので、一概にどうすべきということは
    言えませんが、NAT+ホストオンリーネットワークの構成が一般にお勧めです。
    デフォルトの状態でNAT用のNICが構成されているので、ホストオンリーネットワーク用のNICを1つ追加しておきましょう。NAT用のNICをインターネットへのアクセスに使用し、ホストオンリーネットワーク用のNICをマシンとの通信に使用します。

    VMを起動し、設定を修正する

    Database App Development VM の OS は、Oracle Linux 7です。
    以前のDatabase App Development VM の OS はOracle Linux 6だったと思うのですが、なぜか現行はOracle Linux 7になってしまいました。

    Oracle Linux 7は、Red Hat Enterprise Linux 7と同様にリリースされて半年ほどしか経過していません。Oracle Linux 7のスキルを持ち合わせている人は少ないのではないでしょうか。
    また、現在 企業システムで使われるLinuxの大部分は、Red Hat Enterprise Linux 6 (≒ Oracle Linux 6)または Red Hat Enterprise Linux 5 ( ≒ Oracle Linux 5)ですので、今のタイミングでOracle Linux 7 のスキルを習得するのに躊躇されるかたもいらっしゃるのではないでしょうか。(率直にいって、私もその一人です)

    VMを起動すると、(このVMでは)oracleユーザーでGNONEのデスクトップにログインした状態になります。早速、Oracle Databaseを使用して・・・と行きたいところですが、いくつか設定の修正をしておきましょう。

    まず、デフォルトではキーボードレイアウトが英語配列になっており、一般的な日本語キーボードでは記号類が適切に入力できませんので、修正します。

    Applications → System Tools → Settings
    から
    Keyboard を選択し、Input Souces で日本語入力を追加して、デフォルトの英語入力を削除します。









    次に、追加したホストオンリーネットワーク用のNICを有効にし、
    固定IPアドレスを割り当てましょう。
    ここで指定したIPアドレスを用いて、ホストマシンからVMへアクセスします。

    NICの設定は
    Applications → System Tools → Settings
    からNetwork を選択し、追加したNICを有効にしてプロファイルを追加してIPアドレスを設定します。





    VirtualBoxは、デフォルトでホストオンリーネットワーク用に192.168.56.0/24のセグメントを割り当て、192.168.56.101以降の帯域をDHCPを用いた動的IPアドレス割り当てに使用します。
    したがって、ホストオンリーネットワーク用のNICに割り当てる固定IPアドレスは、
    192.168.56.2-100の範囲から選んでください。
    ここでは、192.168.56.2を指定しています。

    これで、ホストマシンからsshでVMに接続できるようになります。

    データベースに接続する・・・しかしなんか変だ

    初期状態でデータベース、リスナーが構成済みで、OS起動時に自動起動するようになっています。

    また、データベースの名前は cdb1 で、Oracle Database 12cから導入されたマルチテナント構成です。
    12c の目玉がマルチテナントなのはわかりますが、初めてさわるデータベースがマルチテナント構成というのはちょっと厳しい・・・

    しかも、こんな罠に引っかかってしまいました。


    [oracle@localhost ~]$ sqlplus / as sysdba
     
    SQL\*Plus: Release 12.1.0.2.0 Production on 水 12月 3 21:49:44 2014
     
    Copyright (c) 1982, 2014, Oracle. All rights reserved.
     
    ERROR:
    ORA-01017: invalid username/password; logon denied

    お馴染みの sqlplus / as sysdba で接続しようとするとORA-01017で接続に失敗します。

    試しにユーザー名とパスワードを明示的に指定すると接続に成功します。


    [oracle@localhost ~]$ sqlplus sys/oracle as sysdba
     
    SQL\*Plus: Release 12.1.0.2.0 Production on 水 12月 3 21:51:36 2014
     
    Copyright (c) 1982, 2014, Oracle. All rights reserved.
     
     
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
     
    SQL>

    なぜだかわかりますかね? また、どこら辺が怪しいと思われますか?

    自分はユーザー名を指定すると成功することから、OS認証が適切に機能していないことを疑い、OS認証関連の箇所を調査しました。でも、どこも怪しくないんですねぇ・・・・


    [oracle@localhost ~]$ id
    uid=1000(oracle) gid=1000(oracle) groups=1000(oracle),10(wheel),990(vboxsf) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

    oracleユーザーはoracleグループのメンバで、


    [oracle@localhost ~]$ grep DBA $ORACLE_HOME/rdbms/lib/config.c
    /* SS_DBA_GRP defines the UNIX group ID for sqldba adminstrative access. */
    \#define SS_DBA_GRP “oracle”
    {SS_DBA_GRP, SS_OPER_GRP, SS_ASM_GRP,

    Oracle Database側でも DBAグループはちゃんと”oracle”になっている・・・

    なんとか糸口を見つけようとシステムコールトレースを習得しても、Netトレースを取得してもわからない・・・が、いろいろやっているうちにヒントにつながる奇妙な動作を見つけました。


    [oracle@localhost lib]$ sqlplus sys/oracle as sysdba
     
    SQL\*Plus: Release 12.1.0.2.0 Production on Wed Dec 3 20:08:22 2014
     
    Copyright (c) 1982, 2014, Oracle. All rights reserved.
     
     
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
     
    SQL> shutdown immediate
    Pluggable Database closed.
    SQL> exit
    Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
    [oracle@localhost lib]$ lsnrctl stop
     
    LSNRCTL for Linux: Version 12.1.0.2.0 – Production on 03-DEC-2014 20:08:38
     
    Copyright (c) 1991, 2014, Oracle. All rights reserved.
     
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))
    The command completed successfully

    インスタンスとリスナーを停止して、プロセスを確認・・・


    [oracle@localhost lib]$ ps -ef
    UID PID PPID C STIME TTY TIME CMD
    root 1 0 0 19:32 ? 00:00:02 /usr/lib/systemd/systemd –switched-root –system –deserialize 23
    :
    oracle 1749 1 0 19:33 ? 00:00:00 ora_pmon_cdb1
    oracle 1753 1 0 19:33 ? 00:00:03 ora_psp0_cdb1
    oracle 1798 1 0 19:33 ? 00:00:03 ora_vktm_cdb1
    oracle 1802 1 0 19:33 ? 00:00:00 ora_gen0_cdb1
    oracle 1817 1 0 19:33 ? 00:00:00 ora_mman_cdb1
    oracle 1824 1 0 19:33 ? 00:00:00 ora_diag_cdb1
    oracle 1829 1 0 19:33 ? 00:00:01 ora_dbrm_cdb1
    oracle 1832 1 0 19:33 ? 00:00:00 ora_vkrm_cdb1
    oracle 1835 1 0 19:33 ? 00:00:02 ora_dia0_cdb1
    oracle 1839 1 0 19:33 ? 00:00:00 ora_dbw0_cdb1
    oracle 1853 1 0 19:33 ? 00:00:00 ora_lgwr_cdb1
    oracle 1868 1 0 19:33 ? 00:00:01 ora_ckpt_cdb1
    oracle 1871 1 0 19:33 ? 00:00:00 ora_lg00_cdb1
    oracle 1882 1 0 19:33 ? 00:00:00 ora_smon_cdb1
    oracle 1890 1 0 19:33 ? 00:00:00 ora_lg01_cdb1
    oracle 1895 1 0 19:33 ? 00:00:00 ora_reco_cdb1
    oracle 1899 1 0 19:33 ? 00:00:00 ora_lreg_cdb1
    oracle 1901 1 0 19:33 ? 00:00:00 ora_pxmn_cdb1
    oracle 1906 1 0 19:33 ? 00:00:04 ora_mmon_cdb1
    oracle 1914 1 0 19:33 ? 00:00:02 ora_mmnl_cdb1
    oracle 1917 1 0 19:33 ? 00:00:00 ora_d000_cdb1
    oracle 1928 1 0 19:33 ? 00:00:00 ora_s000_cdb1
    oracle 1934 1 0 19:33 ? 00:00:00 ora_s001_cdb1
    :
    oracle 4329 3094 0 20:08 pts/1 00:00:00 ps -ef

    あれ? shutdownしたのに バックグラウンドプロセスがまだ残っている・・・
    なにかおかしい・・・ もう一度接続すると・・・


    [oracle@localhost lib]$ sqlplus sys/oracle as sysdba
     
    SQL\*Plus: Release 12.1.0.2.0 Production on Wed Dec 3 20:08:47 2014
     
    Copyright (c) 1982, 2014, Oracle. All rights reserved.
     
    ERROR:
    ORA-12541: TNS:no listener
     
     
    Enter user-name:
    ERROR:
    ORA-12541: TNS:no listener
     
     
    Enter user-name:
    ERROR:
    ORA-12541: TNS:no listener
     
     
    SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL\*Plus

    なぜインスタンスに接続しようとしているのに、リスナーに接続を試みたようなエラーメッセージがでるのだろうか? マルチテナント・・・ リスナー経由の接続・・・・

    もしやPDBに接続をしている?

    しかし、SQL\*Plusではローカル接続を指定しているので、接続先はCDBに限定されるはず・・・
    ローカル接続で接続先を変更するようなものってあったっけ?
















































    お分かりになりましたでしょうか。ただ、ほとんど使用されない環境変数なのでご存じないかもしれません。~/.bash_profileに記載されたTWO_TASK=orclが犯人でした。


    [oracle@localhost ~]$ cat ~/.bash_profile
    \# .bash_profile
     
    \# Get the aliases and functions
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi
     
    \# User specific environment and startup programs
    \#cat /home/oracle/Desktop/readme.txt
     
    export ANT_HOME=/usr/local/apache-ant-1.9.3
    export ORACLE_HOME=/home/oracle/app/oracle/product/12.1.0/dbhome_1
    export ORACLE_SID=cdb1
    export TWO_TASK=orcl <=== export XDB_HOL=Desktop/Database_Track/XMLDB/   PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin:$ANT_HOME/bin     export PATH cd ~     \#gsettings set org.gnome.Vino require-encryption false

    環境変数TWO_TASKってなんだっけ?


    TWO_TASKはほとんど使用されることがない環境変数です。
    マニュアルでも、TWO_TASKについて説明している個所は本当に少ない・・・

    環境変数TWO_TASK(UNIXの場合)またはLOCAL(Windowsの場合)には接続識別子を設定できます。これによって、SQL\*PlusまたはSQL\*Plus Instant Clientで接続が行われるたびに接続識別子を明示的に入力する必要がなくなります。このUNIXの例では、MYDB4という名前のデータベースに接続します。

     

    TNS_ADMIN=/home/user1

    export TNS_ADMIN

    TWO_TASK=MYDB4

    export TWO_TASK

    sqlplus hr

    TWO_TASKが原因だと分かってから、Googleで調べると、悔しいことに事例がたくさん見つかります (><)

JPOUG Tech Talk Night #4 やりますよ! 今回は LTと12c座談会です

前回のJPOUG Tech Talk Night から少し間が空きましたが、3月11日(火) 19:00 に「JPOUG Tech Talk Night #4」やりますよー。

今回のJPOUG Tech Talk Night #4 は、これまでとは若干趣向を変えて、Lightning Talkと座談会という構成でお送りします。

まず、初めてJPOUGのイベントでお話しいただける数名をお招きして、Lightning Talkをしていただきます。スピーカーは調整中(ほぼ決定!)ですが、面白い話を聞かせていただけそうで、私もとても楽しみです。

座談会では、 Oracle Database 12c を題材に取り上げます。
すでに 12cを使ったことがある方、まだ使っていない方、いろいろだとは思いますが、
みんなでざっくばらんに意見交換して、「ユーザーグループならではの催し」にしたいと思います。

12c_jpoug.jpg

私も記事執筆( #1) や記事ドラフトレビュー(
#2,
#3,
#4 )などを通じて、Oracle Database 12cをそれなりに試してきましたので、皆さんのお役に立てるようできる限り有益な情報を提供させていただきたいと思います。

(ちょっと余談ですが、ちなみに、私はすでに グローバルにおけるORACLE MASTER Gold Oracle Database 12c相当の資格であるOracle Database 12c Administrator Certified Professional (OCP 12c)を持ってたりします :-) 英語版の試験を受験しました・・・)

それではイベントでお会いできることを楽しみにしています。お申し込みはこちらから!

2013年 JPOUG活動報告

JPOUG以外の対外的な活動については、

http://co-sol.jp/techdb/2013/12/activities_2013.html

に書きましたが、こちらではJPOUG関連の対外的な活動についてまとめさせていただきます。

JPOUG Tech Talk Night


2013年より、平日夜の技術イベント JPOUG Tech Talk Nightというをはじめました。
私はマネージメントを中心にイベント運営を担当させていただきました。
今後も数ヶ月に1回程度を目標に開催してゆく予定ですので、ぜひご参加ください!

2013年7月2日 JPOUG Tech Talk Night #1



2013年9月6日 JPOUG Tech Talk Night #2



2013年11月13日 JPOUG Tech Talk Night #3


各種イベントへ参加


ありがたいことにいくつかのイベントで発表などの機会をいただきました。お声掛けいただき誠にありがとうございます。個人的には、今年もできるかぎり多くのイベントにご協力してゆきたいと思っています。

2013年9月28日 JAWS Festa 2013 大阪


JAWS-UG が主催する JAWS FESTA Kansai 2013 において、AWS上でのOracle Databaseを トピックにしたアンカンファレンスを行いました。JPOUGのボードメンバーである大島さんがモデレータを務めましたが、私も運営支援として参加しました。

db tech showcase 大阪 2013


インサイトテクノロジーが主催するdb tech showcase 大阪 2013で、JPOUGのメンバー2人、私と大島さんがセッションを行いました。私の担当したセッションのタイトルは”Analyzing Oracle Database hang issues using various diagnostics.”でした。

db tech showcase 東京 2013


インサイトテクノロジーが主催するdb tech showcase 東京 2013で、JPOUGのメンバー4人、私と山下さん、関口さん、新久保さんが「特濃JPOUG」と題した一連のセッションを行いました。私の担当したセッションのタイトルは”Corruption And Revive : 破壊と復活”でした。

JPOUG Advent Calendar 2013


年末恒例のAdvent Calendarです。みんなのblogポストで師走の日の移ろいを楽しみました。

プレゼンス向上に向けた取り組み

おかげさまで、JPOUGがイベントを開催すると、それなりの人数の方に足を運んでいただけるようになっています。しかし、情報を伝達する手段が、個人で対応できる範囲に限定されている、端的にいうとソーシャルメディア系の手段に限定されているため、まだまだリーチできている範囲が少ないことは事実であると考えています。

オラクル製品は、主にエンタープライズIT領域をターゲットにしているため、製品の利用者がソーシャルメディアを積極的に活用していない場合もあるためです。

このような問題意識を受けてアクションした・・というわけではありませんが、幸運なことにご説明の機会やメディア露出の機会をいただけました。今年も引き続き、機会を見つけてJPOUGのプレゼンス向上に向けた取り組みを行いたいと考えています。

コーソルサイトでBlog書いてみます

これまで 本サイトにてBlogを書いてきましたが、どうもエントリの作成が滞りがちなこともあり、心機一転コーソルのサイトでBlogを書いてみることにしました!

住み分けの方針が明確になるまで、 http://www.csus4.net/d/ はしばらくの間放置気味になるかもしれません・・・が、コーソルサイトのBlogでどうぞよろしくお願いいたします!

* コーソル DatabaseエンジニアのBlog

おかげさまでUnconferenceは大盛況でした!

JPOUGがお送りした最初のイベント、Oracle OpenWorld Unconference presented by JPOUG は、おかげさまで大盛況で終了しました! ご参加していただいた皆様、貴重なお時間を割いていただき、どうもありがとうございました!

私は、「バッチ処理にバインド変数はもうやめません? ~バッチ処理の突発遅延を題材にして考えてみる~」と題して、バッチ処理における突発的な処理遅延についてお話させていただきました。

少しセッション時間が短かったこともあり、駆け足での一方的な説明になってしまい、Unconferenceというよりは通常のセミナーになってしまったな・・・ と思っていたところ、セッションの最後の質問タイムで、聴講いただいた方と意見の交換をすることができ、Unconference的なエッセンスを入れ込むことができたように思っています(結果オーライw)。 Nさん、ご質問いただきありがとうございました!(感謝感激)

また、幸運なことに、本セッションの前に、SQLのバインド変数化という題材をOLTPの観点で、sh2さんにご説明いただいていました。本セッションではOLTPではなくバッチの観点で説明しましたので、同じ題材をそれぞれのセッションで異なる観点で説明で来た形になり、聞いていただいた方がより理解を深めることができたのではと考えています。sh2さん、ありがとうございました!

当日発表に使用した資料を以下においておきます。



さて、ご参加いただいた方は実感されたとは思いますが、日本オラクルさま主催のセッションとはかなり色合いの異なる内容になっています。(マニュアル活用方法を題材にしたエンジニアのスキル向上に関するアドバイスしかり、MySQLとOracle Databaseの比較しかり・・・) 私個人の意見ですが、この点が 日本オラクルさまでなく、JPOUG がイベントを企画する大きな意味であると思っています。
今回のイベントの雰囲気を伝えるtweetは、Oracle OpenWorld Unconference presented by JPOUG – Togetter にまとまっています。(楽しそうでしょ?)
6月を目標に次回イベントを企画中です。企画が進行しだいイベント情報を発信させていただきますので、
ぜひFacebookページに「いいね!」してみてください!

ご支援いただいた皆様に感謝したいと思います。

Oracle OpenWorld Tokyo 2012事務局のみなさま、OTN事務局のみなさま、Unconferenceをご支援いただきありがとうございました。まだ立ち上がったばかりの団体に対して、貴重な場を提供いただき、まことにありがとうございました。

セッションをご担当いただいたスピーカのみなさま、ありがとうございました。業務などで多忙な状況で、準備や調整を実施いただいたかと思います。みなさまのおかげで、イベント全体のセッション内容を、バリエーションに富んだ、より価値あるものにできました。まことにありがとうございます。

最後に、私のこのような活動に理解を示してくれている、職場のみなさん、ありがとうございます!
私が心置きなくセッションを担当できたのも、みなさんのおかげです! 感謝してもしきれません、ありがとう!!!

Oracle OpenWorld Unconference presented by JPOUG

JPOUGがお送りする最初のイベントは、Oracle OpenWorld Unconference !!
Oracle OpenWorld Tokyo 2012の最終日(4/6(金))に
12:30から18:00ごろまで開催します!



Unconference とは、少なめの人数でスピーカーとリスナーがいろいろやり合いながらすすめる
ユニークな形式のセミナー(?)です。
oracletech.jpにも紹介記事があります。こちらを見ていただくと、よりイメージをつかめるかも・・・


Oracle OpenWorld の特別セッション「Oracle OpenWorld Unconference presented by JPOUG」

場所は 六本木アカデミーヒルズ49 です。以下のURLの地図も合わせてご覧ください!

http://www.oracle.com/openworld/jp-ja/access/index.html

http://www.academyhills.com/forum/room/49/index.html

開催時間帯は、JPUOGメンバー
誰かしら会場にいるはずです。Oracle製品に携わるエンジニアのお祭りです。楽しみましょう!

なにかご要望やご意見がある方は、Facebookページにコメントを。

Facebook – JPOUG fanpage

ついでに「いいね!」してもらえるとうれしいです。

JPOUG Webサイト & Facebookページ公開! + IOUCに参加

またまた久しぶりなBlogの更新となっております・・・

去年から運営メンバーの一員として打ち合わせなどに参加してきましたが、
JPOUG (Japan Oracle User Group)のWebサイトを立ち上げることができました。

JPOUG (Japan Oracle User Group) – http://www.jpoug.org

あわせて、各種の交流やイベント告知などの情報発信のため、Facebookページも作成しています。
もしよろしければ、アクセスいただき、「いいね!」をお願いいたします。

Facebook – JPOUG fanpage

また、JPOUGがIOUC(International Oracle Users Group Community)へ参加することに決まりました。

http://www.iouc.org/p/cm/ld/fid=45&region=14&gid=590

Oracle製品ユーザーの交流を深めましょう!!

9/30(金) Oracle LOVERS2 でお話させていただきました。

Blogの更新が滞り、申し訳ございません・・・
9/30(金) Oracle LOVERS シーズン2 第2回 でお話させていただきました。

50名強(もしかするとそれ以上)という多くの方にご出席いただいただけでなく、
著名なOracleエンジニア方々の前で話すということで、非常に緊張いたしましたが
主催者の吉田さんのご配慮もあり、楽しい時間をすごすことができました。

* [Oracle LOVERS シーズン2 第2回 – oracletech.jp]( http://oracletech.jp/seminar/recommended/000387.html )
* [Oracle LOVERS シーズン2 第2回 – Zussar]( http://www.zusaar.com/event/agZ6dXNhYXJyDQsSBUV2ZW50GP_jBgw )

わざわざ貴重なお時間を割いて、ご参加いただいた皆様、ありがとうございました。
実際の業務に有用な情報を1つでもご提供できたらうれしく思います。

また、主催者の吉田さん、いつもありがとうございます。
吉田さんの人柄がなせるものと思いますが、Oracle LOVERSはいつもリラックスした楽しい雰囲気で、
とてもすばらしいですね。
お忙しいとは思いますが、今後もぜひOracle LOVERSを継続していただけたらと思います。

今回の発表資料を公開する予定はありませんが、前半部分のデモで多用した
DBMS_XPLAN.DISPLAY_CURSORの使い方については過去のBlogエントリの内容が参考になると
思いますので、以下にリンクを張っておきます。参考にしていただければ幸いです。

* [SQLパフォーマンス問題調査でEXPLAIN PLAN、SQLトレースは(ほとんど)使わない](http://www.csus4.net/d/2011/02/24/whynotuse_explainplan_sqltrace/)
* [DBMS_XPLAN.DISPLAY_CURSORの使い方とちょっとした落とし穴](http://www.csus4.net/d/2011/03/24/display_cursor_howto/)
* [DISPLAY_CURSORでCBOの見積りミスを簡単に確認する](http://www.csus4.net/d/2011/04/30/check_cbo/)

それでは・・・

フィルタ述語とアクセス述語 (実行計画の読み方#3)

さて、これまでで、実行計画のツリーのたどり方と、ツリーの構成要素である各オペレーションで
実行されている処理の概要がわかったと思います。

しかし、これだけの情報では、実行計画と実行されたSQLのWHERE条件を対応づけて理解することは
難しいです。(できなくはありませんが、かなり推測に頼る形になります。)

SQLのWHERE条件と対応付けるためには、フィルタ述語とアクセス述語に着目する必要があります。

### Predicate Informationセクション

実行計画をDBMS_XPLAN.DISPLAY_CURSORで取得した場合、フィルタ述語とアクセス述語に関する情報は
Predicate Informationセクションに表示されます。

—————————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
—————————————————————————————–
| 0 | SELECT STATEMENT | | | | 20 (100)| |
| 1 | NESTED LOOPS | | 10 | 40120 | 20 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL | PA | 1 | 2004 | 9 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| CH | 10 | 20080 | 11 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | IDX_CHPA | 10 | | 1 (0)| 00:00:01 |
—————————————————————————————–

Predicate Information (identified by operation id): ←★
—————————————————

2 – filter(“PA”.”PID”=1)
4 – access(“CH”.”PID”=1)

Predicate Informationセクション内のフィルタ述語、アクセス述語の先頭には
オペレーション(ステップ)に対応するIdが記載されています。

Continue reading フィルタ述語とアクセス述語 (実行計画の読み方#3)

オペレーションの一覧と最低限覚えておくべきオペレーション (実行計画の読み方#2)

先のエントリの説明で、実行計画をいわば「形式的には読める(*1)」ようにはなりました。
しかし、実行計画が何をやっているのかという、意味的な観点では「理解できていない」はずです。
実行計画の処理内容を理解するためには、実行計画を構成するオペレーションの処理内容を理解する
必要があります。

* (*1) 「たどれる」という表現のほうが近いかもしれませんが・・・

### オペレーションの一覧

Oracle Databaseには非常に多くのオペレーションが存在し、
大部分のオペレーションについては、マニュアルの以下の箇所で説明されています。

* [10.2](http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19207-02/ex_plan.htm#59155)
* [11.1](http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05743-02/ex_plan.htm#sthref1154)
* [11.2](http://download.oracle.com/docs/cd/E16338_01/server.112/b56312/ex_plan.htm#i23461)

### 最低限覚えておくべきオペレーション

全てのオペレーションに関して説明することは、現実的でないため、
先のエントリで説明した実行計画に含まれるオペレーションを説明します。
なお、このエントリに含まれるオペレーションは、非常に多くの実行計画で使用されうる、
非常に重要なものであり、最低限覚えておく必要があります。

—————————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
—————————————————————————————–
| 0 | SELECT STATEMENT | | | | 20 (100)| |
| 1 | NESTED LOOPS | | 10 | 40120 | 20 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL | PA | 1 | 2004 | 9 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| CH | 10 | 20080 | 11 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | IDX_CHPA | 10 | | 1 (0)| 00:00:01 |
—————————————————————————————–

Continue reading オペレーションの一覧と最低限覚えておくべきオペレーション (実行計画の読み方#2)