WR blog

about Enterprise IT, Oracle Database, Jazz/Fusion Music, etc…

WR blog RSS Feed
 
 
 
 

Developers Summit 2009でお話させていただきます!

なんとDevelopers Summit 2009(2/13(金) 13:10~14:00 at 目黒雅叙園)にてお話させていただくことになりました! 講演のタイトルは「プロとしてのOracleアーキテクチャ入門 ~番外編~」です。 来場される方の担当業務としては、DBA、インフラ設計よりはむしろ SQL/プログラム開発の方が多いのかなという判断で、 SQL実行/チューニングにまつわる Oracleアーキテクチャについてお話させていただきます。 書籍「プロとしてのOracleアーキテクチャ入門」でいうと、 「CHAPTER 13 問い合わせ処理の仕組み」+αの内容になると思います。

「テクノロジーの変化を体感するためのDevelopmentStyle 2.0」というテーマに 沿うよう、11g新機能や知られていないテクノロジを紹介できるように準備を進めてい ますが、SQL/プログラム開発の方にターゲットを絞っている関係上、 内容的には基本的/基礎的なものになるかと思いますので、この点、あらかじめご了承 ください。

さて、具体的には、以下の内容についてお話させていただく予定です。

  • SQL実行のためのOracleアーキテクチャ
  • 実行計画とCBO
  • ヒストグラムと最適なアクセスパス
  • SQL開発におけるOracleアーキテクチャ特有の注意点
    • オプティマイザ統計の重要性
    • 共有プールのflush
    • バインドピーク

それでは、当日会場でお会いできることを楽しみにしています。

CHAPTER 02 クライアントアプリケーションとサーバープロセス - プロとしてのOracleアーキテクチャ入門

今回のentryでは、「SECTION I Oracleアーキテクチャ概要」の「CHAPTER 02 クライアントアプリケーションとサーバープロセス」について補足説明します。 この章では、SQL*PlusなどのOracleに接続するアプリケーションである「クライアントアプリケーション」 とクライアントから指示に従い実際に処理を実行する「サーバープロセス」について説明しています。

あるクライアントアプリケーションがOracleに接続すると、そのクライアントアプリケー ション専用のサーバープロセスが起動します。 ここで、クライアントアプリケーションとサーバープロセスの間に設定されるコネクションを、 Oracleではセッションと呼びます。 これらについては、書籍で説明したとおりですが、このentryでは、 Linux上でクライアントアプリケーションとしてSQL*PlusでOracleに接続した場合を例に、 クライアントアプリケーションとサーバープロセスの関係について、 プロセスの相互関係、セッションの観点から確認してみます。

まず、SQLPlusを起動して、connectコマンドでOracleに接続すると、サーバープロセス が起動します。 これは、SQLPlusにおいて、fork()、exec()システムコールを実行することで、 プロセスが複製され、複製されたプロセスの実体がoracleプログラムに変わるためです。 このような処理を行うことで、サーバープロセスに対応したプロセスが新規に作成されます。 そして、このサーバープロセスはSQLPlusの子プロセスとなり、 サーバープロセスとSQLPlusは子プロセス、親プロセスの関係をもちます。 そして、2つのプロセス間にパイプと呼ばれるプロセス間通信路を設定します。 すなわち、セッションはパイプにより実現されるわけです。

ここで説明した動作を実際に確認してみましょう。 まず、SQL*Plusを実行して、Oracleに接続してみます。

  [o11106@hp1 ~]$ sqlplus /nolog

  SQL*Plus: Release 11.1.0.6.0 - Production on 日 11月 9 15:36:10 2008

  Copyright (c) 1982, 2007, Oracle.  All rights reserved.

  SQL> connect / as  sysdba
  接続されました。
  SQL>

このとき、pstreeコマンドを使用して、プロセスの親子関係を確認してみます。

[o11106@hp1 ~]$ pstree -p -a o11106
bash(9438)
 (略)
sshd,9667
  `-bash,9668
      `-sqlplus,9694
          `-oracle,9697 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

SQL*Plus(コマンド名:sqlplus, プロセスID:9694)と、 サーバープロセス(コマンド名:oracle, プロセスID:9697)が親子関係にあることが 確認できます。

次に、サーバープロセスとSQL*Plusの間に存在するパイプを確認してみましょう。

[o11106@hp1 ~]$ sudo /usr/sbin/lsof -u o11106  |head -1
COMMAND  PID   USER   FD   TYPE     DEVICE      SIZE     NODE NAME
[o11106@hp1 ~]$ sudo /usr/sbin/lsof -u o11106  |grep pipe
 (略)
sqlplus 9694 o11106   14w  FIFO        0,7              75491 pipe
sqlplus 9694 o11106   15r  FIFO        0,7              75492 pipe
oracle  9697 o11106   13r  FIFO        0,7              75491 pipe
oracle  9697 o11106   16w  FIFO        0,7              75492 pipe
 (略)

SQL*Plus(コマンド名:sqlplus, プロセスID:9694)と、 サーバープロセス(コマンド名:oracle, プロセスID:9697) の間に2つのパイプ(NODE:75491,75492) が存在することがわかるでしょう。 図式すると以下のようになります。

           w                       r
SQL*Plus   ----<PIPE NODE:75491>---> サーバープロセス
(PID:9694) r                       w (PID:9697)
           <---<PIPE NODE:75492>----

このようなfork(), exec()システムコール、pipeを使った子プロセスの生成、親子プロセス間の 通信はUNIX系プラットフォームにおいてはごくごく一般的な方法です。 Oracleにおいても、このような一般的な方法を用いて、ローカル接続を実現しています。

なお、リモート接続の場合はリスナープロセス(コマンド名:tnslsnr)がサーバープロセスを 子プロセスとして生成しています。(内部的にdouble-folkを使用)

CHAPTER 01 データベースとインスタンス - プロとしてのOracleアーキテクチャ入門

私が中心になって執筆した書籍 「プロとしてのOracleアーキテクチャ入門」について、 紙幅や構成上の制約で触れることができなかった点、誤記などについて、 各章ごとに補足説明をしたいと思っています。

今回のentryでは、「SECTION I Oracleアーキテクチャ概要」の「CHAPTER 01 データベースとインスタンス」 について説明します。 この章では、OS上のファイルの集合として構成される「データベース」と、 OS上のプロセスとメモリとして実現される「インスタンス」について取り上げています。

ファイルはlsコマンド(UNIX/Linux)や、エクスプローラ(Windows)にて実際に確認できます から、「データベース」についてはイメージしやすく実感がわきやすいものと思います。

しかし、プロセスとメモリとして実現される「インスタンス」については、 理解がしにくいかもしれません。このため、書籍のP17 では、UNIX/Linux版Oracleを例にとり、 psコマンドやshow sgaコマンド(SQL*Plus)の実行例を記載することで、 理解を助けるように工夫しています。読者がより親しんでいるであろうOSのWindows版 Oracleを例にとり説明できればよかったのですが、以下の理由でUNIX/Linuxプラットフォーム での説明とせざるをえませんでした。

  • Windows版OracleではOracleのプロセス(バックグラウンドプロセス、サーバープロセス)は Oracle.exe内のスレッドとして実装されているため、容易に確認できないこと
  • Windows版Oracleでは、OracleDatabaseサービスを起動すると、デフォルトでインスタンス も自動的に起動してしまうするため、「インスタンス未起動」→「インスタンス起動」の 流れを説明しにくいため(※: 一旦インスタンスを停止してから、インスタンスを起動する必要がある。)
  • 本書の冒頭部分の、まだ「データベース」や「インスタンス」について理解ができていない 時点で、UNIX/Linux版OracleとWindows版Oracleの実装上の違い(スレッド、プロセス、OracleDatabaseサービス) について触れることは理解の点で混乱を招く可能性が高いこと

ここでは、P17の内容をWindows版Oracleを使って説明してみることにします。UNIX/Linux版OracleとWindows版Oracleのアーキテクチャの違いについて理解の度合いを確認してみてください。

コマンドプロンプトでの実行例を以下に示します。

C:\>net start OracleServiceO111                                           (1)
OracleServiceO111 サービスを開始します................
OracleServiceO111 サービスは正常に開始されました。

C:\>sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 金 11月 7 09:37:02 2008

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

SQL> connect / as sysdba
接続されました。
SQL>
SQL>
SQL> shutdown immediate                                                   (2)
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> host pslist -x oracle                                                (3)

pslist v1.28 - Sysinternals PsList
Copyright c 2000-2004 Mark Russinovich
Sysinternals

Process and thread information for host0:

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time
oracle              712   8   5  151  27592     0:00:15.390     0:01:32.843
                      VM      WS    Priv Priv Pk   Faults NonP Page
                  188172   50300   27592  264788   111314    7  350
 Tid Pri    Cswtch            State     User Time   Kernel Time   Elapsed Time
3988   9       128   Wait:Executive  0:00:00.000   0:00:00.078    0:01:32.843
3232   9       136     Wait:UserReq  0:00:00.000   0:00:00.015    0:01:32.718
3412   9        15     Wait:UserReq  0:00:00.000   0:00:00.000    0:01:32.703
3880  11        15       Wait:Queue  0:00:00.000   0:00:00.000    0:01:32.281
 968   9       646     Wait:UserReq  0:00:00.203   0:00:00.015    0:00:21.484


SQL> startup                                                              (4)
ORACLEインスタンスが起動しました。

Total System Global Area  313860096 bytes
Fixed Size                  1332892 bytes
Variable Size             197134692 bytes
Database Buffers          109051904 bytes
Redo Buffers                6340608 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL> host pslist -x oracle                                                (5)

pslist v1.28 - Sysinternals PsList
Copyright c 2000-2004 Mark Russinovich
Sysinternals

Process and thread information for host0:

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time
oracle              712   8  27  558 256752     0:00:26.750     0:02:27.093
                      VM      WS    Priv Priv Pk   Faults NonP Page
                  562764  211136  256752  266160   193572   53  351
 Tid Pri    Cswtch            State     User Time   Kernel Time   Elapsed Time
3988   9       128   Wait:Executive  0:00:00.000   0:00:00.078    0:02:27.093
3232   9       136     Wait:UserReq  0:00:00.000   0:00:00.015    0:02:26.968
3412   9        22     Wait:UserReq  0:00:00.000   0:00:00.000    0:02:26.953
3880  11        18       Wait:Queue  0:00:00.000   0:00:00.000    0:02:26.531
3844   8       126     Wait:UserReq  0:00:00.000   0:00:00.000    0:00:37.265
3784  15      1870   Wait:DelayExec  0:00:00.000   0:00:00.000    0:00:37.250
3188   8        97     Wait:UserReq  0:00:00.000   0:00:00.000    0:00:37.250
2888   8        95     Wait:UserReq  0:00:00.015   0:00:00.015    0:00:37.218
1356   8       111     Wait:UserReq  0:00:00.000   0:00:00.015    0:00:37.218
2520   8       118     Wait:UserReq  0:00:00.015   0:00:00.000    0:00:37.203
1396   9       219     Wait:UserReq  0:00:00.078   0:00:00.015    0:00:37.203
1260   8       145     Wait:UserReq  0:00:00.015   0:00:00.000    0:00:37.187
2928   9       255     Wait:UserReq  0:00:00.000   0:00:00.015    0:00:37.187
1716   9       129     Wait:UserReq  0:00:00.000   0:00:00.000    0:00:37.171
3804   8       514     Wait:UserReq  0:00:00.062   0:00:00.046    0:00:37.171
1908   8        87     Wait:UserReq  0:00:00.000   0:00:00.015    0:00:37.171
2132   8      1986     Wait:UserReq  0:00:00.984   0:00:00.015    0:00:37.156
3312   8       103     Wait:UserReq  0:00:00.000   0:00:00.015    0:00:37.156
3240   8       113     Wait:UserReq  0:00:00.000   0:00:00.000    0:00:37.140
2856   8        91     Wait:UserReq  0:00:00.000   0:00:00.000    0:00:37.140
2640   8     12670     Wait:UserReq  0:00:06.640   0:00:00.390    0:00:28.734
2796   8       137     Wait:UserReq  0:00:00.015   0:00:00.000    0:00:26.890
1508   8       106     Wait:UserReq  0:00:00.000   0:00:00.000    0:00:26.875
2668   8        72     Wait:UserReq  0:00:00.015   0:00:00.031    0:00:25.562
1624   8        35     Wait:UserReq  0:00:00.000   0:00:00.015    0:00:23.875
 796   8        54     Wait:UserReq  0:00:00.015   0:00:00.000    0:00:15.437
3744   8        33     Wait:UserReq  0:00:00.015   0:00:00.000    0:00:15.421

SQL> select spid, program from v$process;

SPID                     PROGRAM
------------------------ ---------------------
                         PSEUDO
3844                     ORACLE.EXE (PMON)
3784                     ORACLE.EXE (VKTM)
3188                     ORACLE.EXE (DIAG)
2888                     ORACLE.EXE (DBRM)
1356                     ORACLE.EXE (PSP0)
1396                     ORACLE.EXE (MMAN)
2520                     ORACLE.EXE (DIA0)
1260                     ORACLE.EXE (DBW0)
2928                     ORACLE.EXE (LGWR)
1716                     ORACLE.EXE (CKPT)
3804                     ORACLE.EXE (SMON)
1908                     ORACLE.EXE (RECO)
2132                     ORACLE.EXE (MMON)
3312                     ORACLE.EXE (MMNL)
3240                     ORACLE.EXE (D000)
2856                     ORACLE.EXE (S000)
2796                     ORACLE.EXE (FBDA)
3476                     ORACLE.EXE (CJQ0)
1508                     ORACLE.EXE (SMCO)
2668                     ORACLE.EXE (QMNC)
2764                     ORACLE.EXE (W000)
796                      ORACLE.EXE (q000)
3744                     ORACLE.EXE (q001)
1704                     ORACLE.EXE (SHAD)

25行が選択されました。

(1)では、Oracleインスタンスに対応したWindowsサービス OracleDatabaseO111を起動しています。 この実行例ではインスタンスのORACLE_SIDはO111です。これでOracle.exeが起動します。

(2)では、OracleDatabaseサービス起動時に自動的にインスタンスが起動するため、インスタンスを一旦 shutdownしています。

(3) では、pslistを使って、Oracle.exe内のスレッドを確認しています。ここでは、5つのスレッドが 起動していることがわかります。 なお、pslistはMicrosoft(旧sysinternal)から公開されているプロセス、スレッドの情報が確認 できるコマンドラインツールです。

pslistを使用するには、上記URLからファイルをダウンロード、展開して、 PATH環境変数を設定する必要があります。

(4) では、インスタンスを起動しています。 (5) では、pslistを使って、Oracle.exe内のスレッドを再度確認しています。ここでは、27つのスレッドが 起動していることがわかります。(3)のインスタンス停止時よりも起動しているスレッド数が増えて いることがわかるでしょう。これらのスレッドがバックグラウンドプロセスに相当します。 pslistのTID(スレッドID)は、V$PROCESSから確認できるSPIDに対応します。

(6) では、v$process の実行結果を示しています。pslistの実行結果と照らし合わせてみてください。

インスタンスとプロセスから構成されるUNIX/Linux版Oracleと異なり、 サービスやスレッドも関連するWindows版Oracleは、理解しにくいかもしれません。 実はこの理解のしにくさが、書籍でUNIX/Linuxプラットフォーム上での Oracleを例にとりpsコマンドやshow sgaコマンド(SQL*Plus)の実行例を用いて説明した理由でも あります。

なお、UNIX/Linux版OracleとWindows版Oracleのアーキテクチャの違いについては、書籍 P106でも触れていますので、是非参考にしてください。 また、マニュアル『Oracle Databaseプラットフォーム・ガイド 11gリリース1(11.1) for Microsoft Windows E05885-03』 の『1 WindowsでのOracle Databaseアーキテクチャ』、『D Oracle DatabaseのWindowsとUNIXでの相違点』にも説明があります。必要に応じて確認してみてください。

書籍 「プロとしてのOracleアーキテクチャ入門」を執筆しました

(なんと前回のエントリから3年近く間が空いてしまいました・・・) Oracle Database のアーキテクチャについて説明した書籍「プロとしてのOracleアーキテクチャ入門」を 執筆するお話をソフトバンククリエイティブ社様よりいただき、 同じ職場のOracle暦10年のベテランエンジニアの方と共同で執筆作業をすすめ、 2008/8/22に(なんとか)無事出版できました。

Amazonのレビューでも好意的なコメントをいただけており、ほっと一安心といったところです。

執筆のお話を頂戴したのは、2007年の年末で、当初のプランでは ゴールデンウィーク前に執筆を終えるはずだったのですが、 紆余曲折あり執筆に半年以上の期間を要してしまいました・・・。 しかも、ページ数は(おそらくシリーズ最大の)400ページ。 長期間に渡る執筆において、大量の原稿に対して的確なフォローをしていただけた 編集の方にはとても感謝しております。ありがとうございました!

目次

  • INTRODUCTION なぜOracleのアーキテクチャを学ぶのか
  • SECTION Ⅰ Oracleアーキテクチャ概要
    • CHAPTER 01 データベースとインスタンス
    • CHAPTER 02 クライアントアプリケーションとサーバープロセス
    • CHAPTER 03 データファイルと関連する構成要素
    • CHAPTER 04 REDOログファイルとREDOデータ
    • CHAPTER 05 サーバーパラメータファイルと制御ファイル
    • CHAPTER 06 Oracleのメモリ管理
    • CHAPTER 07 その他の構成要素
  • SECTION Ⅱ スキーマオブジェクトとデータ格納方式
    • CHAPTER 08 ユーザーと権限
    • CHAPTER 09 テーブルとデータ型
    • CHAPTER 10 索引の仕組み
    • CHAPTER 11 その他のオブジェクト
    • CHAPTER 12 オブジェクトの格納方式と記憶域
  • SECTION Ⅲ SQL処理の仕組み
    • CHAPTER 13 問い合わせ処理の仕組み
    • CHAPTER 14 更新処理の仕組み
  • SECTION Ⅳ トランザクション処理
    • CHAPTER 15 トランザクションの概要とACID特性
    • CHAPTER 16 Oracleのトランザクションと隔離性
    • CHAPTER 17 Oracleのロック機能
  • SECTION Ⅴ 起動・停止とリカバリの仕組み
    • CHAPTER 18 インスタンスの起動と停止
    • CHAPTER 19 リカバリ処理の仕組み
  • SECTION Ⅵ Oracle Net Servicesとクライアント/サーバー
    • CHAPTER 20 基本的な接続形態とNet Servicesの構成
    • CHAPTER 21 動的サービス登録/共有サーバ構成/データベースリンク

執筆において留意した点

書籍「プロとしてのOracleアーキテクチャ入門」の執筆にあたっては、以下の点に留意しました。

  • 図版の説明だけでなく、実際の動作や、Oracleが提供するディクショナリ情報(=内部管理情報)、統計情報をあわせて示し、読者が具体的に、実感を持って理解できるように工夫すること
  • 各章・各節で説明の対象となっているアーキテクチャの構成要素と、Oracleアーキテクチャの全体の位置関係を示し、 読者が「暗い森の中でさ迷うような感覚」に陥らないようにすること
  • 手ごろ情報が少なく、トラブルの種、理解の障害になりがちな以下の点についてコンパクトな説明を提供すること
    • 1) Windows版Oracleのアーキテクチャ
    • 2) Net Servicesの構成
  • Enterprise ITシステムの開発における最重要概念であるにもかかわらず、多くの人に適切に理解されていない「トランザクション」について、Oracleと標準SQLを比較しながら、シーケンス図を多用してわかりやすく説明すること
  • 利用するにあたって理解しておいてほしいOracle特有の概念である、「インスタンスとデータベース」「SYSDBA権限」「セグメント、エクステント、ブロック」などを説明すること
  • 「実行計画」、「バックアップとリカバリ」などの、中級レベルのOracleユーザーで理解しておいてほしい概念について、導入的な意味合いの説明をすること
  • 「SECTION Ⅰ Oracleアーキテクチャ概要 」にてアーキテクチャの構成要素について概要を説明した後、アーキテクチャの構成要素がどのように相互作用して機能を実現しているかを、SECTION Ⅱ以降で説明する構成として、機能に関連付けてアーキテクチャを理解できるようにすること

執筆の記載内容とOracleのマニュアル

表現の工夫はさておき、記載内容の観点では、本書の内容は、Oracleのマニュアルに記載されているものがほとんどで、特殊なものは含まれていません。Oracleのマニュアルは基本的にすべて日本語版が提供されており、量的にも質的にも十分なものがあります。 しかし、あまりにも量が膨大であるために、特定の内容について調べたいとき、どのマニュアルを読めば よいかを判断することすら簡単ではありません。(慣れてくれば何とかなるのですが・・・)

たとえば、Oracle(R11.1)のマニュアルを例にとると、プラットフォーム(OS)非依存のマニュアルで137(オプション機能のマニュアルを含む)、プラットフォーム依存のマニュアルで39ものマニュアルが公開されています。

もちろん、これらすべてのマニュアルを読む必要はありません。 本書で取り上げた内容に、密接にかかわるマニュアルのページ数は以下の表のとおりです。

マニュアルの名称 ページ数 (R11.1)
管理者ガイド PDF版マニュアルでで896ページ
概要 PDF版マニュアルで584ページ
2日で開発者ガイド PDF版マニュアルで198ページ
プラットフォーム・ガイド HTMLでの提供のため、ページ数カウント不可

これだけのボリュームのマニュアルを読みこなすのは、現場の開発者の方には非常に困難でしょう。 また、Oracleのマニュアルが質的に優れているといっても、マニュアルはマニュアルです。 読みこなすのはなかなか大変なものです。

本書は、上に上げたマニュアルの内容の重要な箇所を抜粋したような位置づけにあり、 ある程度の網羅性についても配慮していますから、 マニュアルからOracleのアーキテクチャの理解するかわりにも使用することができます。

書評へのリンク

以下のbloggerの方々から書評をいただいています。ありがとうございます!

そのほか

このblogでは今後、各章ごとに、諸所の理由で記載できなかった説明を追記したり、 図や文章誤記などについて適宜フォローをしていきたいと思っています。

Joel on Software

Joel on Software

業務都合によりあまり時間が取れませんでしたが、私もレビュワーとして協力させていただきました。

この本、本当にいい本です。

第一線でプロとしてソフトウェア開発を行う全員に読んでほしい。 強くそう思います。

超オススメです。 文句なく、自身が読んだ中での今年のNo.1書籍といえますね。

Profile

Jazz/Fusion Musicを愛するIT技術者です。 現在、Oracle Database 関連の仕事をしています。

保有資格

  • Oracle Master 10g Platinum
  • Oracle Master 11g Gold
  • Oracle Master Expert 10g RAC
  • Oracle Master Expert Oracle on Linux
  • LPIC level2
  • 日商簿記3級

連絡先

ご連絡は、wrcsus4 _at_ gmail _dot_ com にお願いいたします。

 

March 2010
M T W T F S S
« Sep    
1234567
891011121314
15161718192021
22232425262728
293031  

Recent Posts

Recent Comments

Tags

Categories

Pages

Archives

Meta