読者からの「質mon」に関する検証

投稿日: 2002年2月06日

~読者からの「質mon」に関する検証~

今回はちゃむが読者の方々のご質問にお答えします。皆様からのご質問が検証
のネタとなり、またエネルギーとなっています。
では、ちゃむさんお願いします。    

<読者からの質問 その1>

oracle ver 7.3.4.4
cpu数は8です

初期パラメータ
parallel_min_servers=0
paraller_max_servers=0 に設定しています

下記のsqlを実行する

select /* +(parallel t360,2) */ * from t360

パラレル・クエリーは実行された?

<ちゃむ>

ご回答いたします。
まず、parallel_max_serversは1以上の値に設定しないとパラレルクエリーは
実行できません。後程、説明する<パラレルクエリーが実行されているかどう
かを確認する方法>で試しましたが、
parallel_max_servers=0
のときは、パラレル処理されませんでした。

また、SQL文は下記の指定が正しいです。

select /*+ parallel(t360,2) */ * from t360

<パラレルクエリーが実行されているかどうかを確認する方法>

実際に使用されたかどうかは、以下のように確認できます。

まず、パラレルクエリーを実行すると複数のセッションが立ち上がります。
例えば、並列度2を指定すると3つのセッションが立ち上がります。一つはコー
ディネータと呼ばれるもので、並列に実行した処理をまとめます。

その様子を以下に示します。

A.

以下のSQL文でこのセッションの監査セッションIDを取得するのがよいでしょう。
これは後程 B の中のSQL文のwhere句で使用します。

SQL> SELECT USERENV(‘SESSIONID’) FROM DUAL

USERENV(‘SESSIONID’)
——————–
25740

SQLPLUS より以下の並列度2のプログラムを実行します。

SQL> select /*+ parallel(e,2) */ * FROM t10man_org e;

B.

別のセッションでSQLPLUS より上記のSQL文を実行中に、以下のSQL文を実行し
ます。

SQL>select ses.SID,ses.SERIAL#,ses.AUDSID , sql.SQL_TEXT
from v$session ses,v$sqlarea sql
where ses.sql_address = sql.address and ses.AUDSID = 25740;

SID SERIAL# AUDSID SQL_TEXT
— ——- —— —————————————————
9 63 25740 select /*+ parallel(e,2) */ * FROM t10man_org e
8 28 25740 SELECT /*+ NO_EXPAND ROWID(A1) */
A1.”EMPNO”,A1.”ENAME”,A1.”JOB”,A1.”MGR”,A1.”HIREDATE”,A1.”SAL”,A1.
“COMM”,A1.”DEPTNO” FROM “T10MAN_ORG” A1 WHERE ROWID BETWEEN :B1 AND :B2
13 11 25740 SELECT /*+ NO_EXPAND ROWID(A1) */
A1.”EMPNO”,A1.”ENAME”,A1.”JOB”,A1.”MGR”,A1.”HIREDATE”,A1.”SAL”,A1.
“COMM”,A1.”DEPTNO” FROM “T10MAN_ORG” A1 WHERE ROWID BETWEEN :B1 AND :B2

ポイントは、V$SESSIONのAUDSID列です。
これは、パラレルで実行するときは、同じ値になるということが確認できると
思います。

一番上で検索されているものが、コーディネータに相当します。

また、今回は、パーティションテーブルを使用していないので、
WHERE ROWID BETWEEN :B1 AND :B2
のようにROWID分割を行なっています。
(パーティションテーブルを使用していれば、パーティションテーブル
ごとに分割されるはずです)

ですが、ディスクがRAID0やRAID0+1やRAID5などを使用して、ストライピング
など(ディスクを適切に分割)していないとCPUにいくら余裕があっても効果
は薄いと思われます。

<読者からの質問 その2>

Oracle8i8.1.7を使っていて、データベースを作成するときのシステム表領域
をローカル管理表領域で作成できるというのを何かの解説書で読んで試そうと
思ったのですが、CREATE DATABASE文の中で

「DATAFILE ‘D:OracledatabaseSYS.DAT’ SIZE 800M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K」

というように指定したのですが、指定できないパラメータを指定した。という
ように怒られてしまいます。

システム表領域をローカル管理表領域で作成するには、どのようにパラメータ
を指定するのでしょうか。Oracle9iでは、ローカル管理表領域が規定値にな
るという話も聞いたので、ちょっと試したくてテストしています。

<ちゃむ>

ご回答いたします。
確かに、9iではローカル管理は、デフォルトで行われるようになります。但し、
SYSTEM表領域に関しては、Oracleは次のように公言しています。

「現行リリース(Oracle9iも含む)ではSYSTEM表領域をローカル管理にするこ
とはできません。」

つまり、まだ、SYSTEM表領域は、ローカル管理にすることはできません。
但し、この文面を見ると将来的には、SYSTEM表領域もローカル管理できるよう
になるはずです。

ちなみに、弊社のORACLE9iの環境では以下のようになっております。やはり、
SYSTEM表領域以外は、ローカル管理です。

SQL> select TABLESPACE_NAME,EXTENT_MANAGEMENT from dba_tablespaces;

TABLESPACE_NAME EXTENT_MAN
—————————— ———-
SYSTEM DICTIONARY
UNDOTBS LOCAL
CWMLITE LOCAL
DRSYS LOCAL
EXAMPLE LOCAL
INDX LOCAL
TEMP LOCAL
TOOLS LOCAL
USERS LOCAL

次回はつけまいが読者のご質問にお答えする予定です。

以上、新宿ライナー最高!?の茅ヶ崎にて