• 検索結果がありません。

オプティマイザの動作とアクセスパスのチェック

ドキュメント内 dbMAGIC Ver8.2 SQLガイド (ページ 88-94)

第 9 章 データの整合性

12.5 オプティマイザの動作とアクセスパスのチェック

MS-SQL Server

プラン表示

MS-SQL Serverでは、オプティマイザの動作は、クエリでプランを使うことでチェックできます。この場合、

クエリの結果が インデックスを使用して出力されたかど うかをチェックできます。プラン表示については 、 MS-SQL Serverの「システム管理者ガ イド 」の第23章「プラン表示の出力」を参照してください。

プランの表示は、SQLコマンド に記述して実行できます。また、ISQL/Wの左下にある[Dbplay Showplan]

アイコンを使用して実行することもできます。

通常、Set Showplanを使うよりも、できるかぎり統計情報だけが出力されるようにしてプランを表示したり、

クエリやインデックスの種類を変えながらプランを表示した方が効率はよくなります。

インデックスの追加などのデータベースイベントによりデータベースの内容が変更された場合、ストアドプ ロシージャを再コンパイルして最適化することが必要になります。ストアドプロシージャは自動的に最適化 されることもありますが 、自動最適化は、ストアドプロシージャが動作しているときにSQLサーバが再起動 されたとき、または、ストアドプロシージャの処理対象となっているテーブルが変更されたときに限って実 行されます。ストアドプロシージャの再コンパイルは、次のコマンド で可能です。

sp_recompiletable_name

12

Oracle

OracleSQLトレース機能

OracleにはSQLトレース機能が搭載され 、この機能を使用してSQLステート メントの統計情報を出力でき ます。

SQLトレース機能は、インスタンスレベルまたはセッションレベルのいずれかで実行できます。SQLトレー ス機能を有効にしておくと、インスタンスまたはユーザセッションで実行されたSQLステート メントに関す る統計情報がトレースファイルに記録されます。

トレースファイルの内容は、TKPROFというプログラムでフォーマットし 、読込可能な出力ファイルに書き 込むことができます。TKPROFでは、また、SQLステート メントの実行プランを作成したり、SQLスクリプ トを作成して統計情報をデータベースに保存するといった処理も行えます。

SQLトレース機能の実行

インスタンスレベルでSQLステート メントの統計情報をトレースしたい場合、SQL TRACEの値をTRUE にします。これで、すべてのセッションについて統計情報がトレースされるようになります。

一方、セッションレベルで( セッションごとに )トレースを行いたいときには、次のSQLコマンド を使い ます。

ALTER SESSION

SET SQL_TRACE = TRUE

また、インスタンスレベルでトレースを実行しており、セッションレベルのトレースは無効にしたいときに は、次のSQLコマンド を使います

ALTER SESSION

SET SQL_TRACE = FALSE

なお、インスタンスレベルでトレースを実行している場合、セッションごとに別個のトレースファイルが作 成されます。

TKPROFの実行

TKPROFを使用して、SQLトレース機能により作成されたトレースファイルをフォーマットし 、出力ファイ ルとして書き込むことができます。また、TKPROFを使うことで、実行プランの作成も行えます。

TKPROF入力トレースファイル 出力ファイルEXPLAIN=ユーザ名/パスワード 上では、「EXPLAIN=ユーザ 名/パスワード 」を指定していますが 、これによりトレースファイル中のSQLステート メントの実行プラン が特定され 、その実行プランが出力ファイルに出力されます。

TKPROFとそのパラメータについては、詳しくは、Oracle 7の「アプリケーション開発者ガ イド 」の付録B

「パフォーマンス診断ツール 」を参照してください。

SQLガ イド 12.4オプティマイザで使われるアクセスパスの指定 12–5

EXPLAIN PLANコマンド

SELECTステート メントまたはDMLステート メントでオプティマイザが使われており、そのオプティマイ ザでど ういった実行プランが使われているかは、EXPLAIN PLANコマンド で表示できます。ここで、実行 プランとは、ステート メントの実行に必要なOracleの処理手順をいいます。

EXPLAIN PLANコマンドではデータが出力されますが 、EXPLAIN PLANの実行の前に、そのデータを格納 するテーブルを用意しておかなければなりません。このテーブルは、CREATE TABLEコマンド を使用して 作成できます。または、UTLXPLAN.SQLスクリプトを実行して作成することもできます。テーブルには任 意の名前を付けることができますが 、カラムの名前とデータ型は、PLAN.TABLEと同じでなければなりま せん。EXPLAIN PLANコマンド の書式は次の通りです。

EXPLAIN PLAN

[SET STATMENT_ID=’テキスト’]

[INTOテーブル]

FORステート メント;

EXPLAIN PLANで作成されたテーブルの内容は、次のSELECTステート メントで取り出すことができます。

SELECT LPAD (’ ’,2*(LEVEL-1))

jj operation _ operations, options, object_name, position FROM plan_table

START WITH id=0

AND statement_id = ’statement id from EXPLAIN PLAN command’

CONNECT BY PRIOR id=parent.id

AND statement.id = ’statement id from EXPLAIN PLAN

command’

EXPLAIN PLANコマンド については、詳しくは、Oracle 7の「SQL言語リファレンスマニュアル」を参照 してください。

12.6

以下は、MS-SQL Serverでのテーブルの作成例です。ここでは、「社員」という名前のテーブルを作成してい ます。SELECTステート メントの例は、この後にあります。

テーブル作成

create table社員 ( 社員番号 integer , 名前 char(20), 部門番号 smallint)

create unique index empno_ind on社員 (社員番号) create index empname_ind on社員 (名前)

insert into 社員values (1,’tomer’,2) insert into 社員values (2,’dalit’,2) insert into 社員values (3,’osnat’,4) insert into 社員values (4,’michel’,1) insert into 社員values (5,’john’,3) insert into 社員values (6,’benjamin’,1)

12

簡単な SELECT ステート メント

SELECT * from社員 WHERE社員番号>1 結果:

ステップ1

クエリは、SELECTとします。

FROM TABLE 社員

Nested iteration Index : empno_ind

社員番号 名前 部門番号

2 Dalit 2

3 Osnat 4

4 Michael 1

5 John 3

6 Benjamin 1

この例では、インデックス(empno ind)を使用してレコード の取り出しが行われます。

WHERE 句と ORDER BY 句を使った SELECT ステート メント

SELECT * FROM 社員

WHERE 社員番号>1 ORDER BY 名前 asc 結果:

ステップ1

クエリは、INSERTです。

更新モード はダ イレクト。

ワークテーブルは、ORDER BYの処理用です。

FROM TABLE 社員

Nested iteration Index : empno_ind TO TABLE

Worktable 1

SQLガ イド 12.6例 12–7

ステップ2

クエリのタイプは、SELECT。この場合、ソートが行われます。

FROM TABLE Worktable 1

Using GETSORTED Table Scan

社員番号 名前 部門番号

6 Benjamin 1

2 Dalit 2

5 John 3

4 Michael 1

3 Osnat 4

WHERE句の優先度はORDER BY句よりも高いため、まず、インデックス(empno ind)を使用してWHERE 句が処理されます。その後、一時ワークテーブル(Worktable 1)を使用して、ソートが実行されます。

社員番号はすべて1より大きい値で、社員はすべて取り出されます。したがって、この場合、インデックス

としてEMPNAME INDを使うことで応答速度を向上させ、抽出漏れもなくなります。インデックスとして

EMPNAME INDを指定したい場合、次のようにします。

SELECT * from社員(index=empname_ind) where 社員番号>1 order by名前

結果:

ステップ1

クエリのタイプは、SELECTです。

FROM TABLE 社員

Nested iteration Index : empname_ind

社員番号 名前 部門番号

6 Benjamin 1

2 Dalit 2

5 John 3

4 Michael 1

3 Osnat 4

13 dbMAGIC SQL

章目次

13.1 何故SQLを使用するのか? : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–2 13.2 dbMAGICSQLサポート 機能 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–2 13.3 dbMAGICSQLの用語 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–3 13.4 データベースゲート ウェイの命名規則 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–3 13.5 dbMAGICAPI、そのバージョン : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–4 13.6 dbMAGICのリポジト リと機能 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :13–4

13

dbMAGIC SQL

dbMAGICは、SQLに対応しています。dbMAGICとSQLデータベースは相互補完的に動作し 、その相性も よく、双方を利用することでソフトウエアのコストも削減できます。dbMAGICで作成したアプ リケーショ ンは、MS-SQL Server、Oracleなど 、SQL対応のRDBMSとともに使用できます。

データベースがSQL対応のRDBMSの場合、dbMAGICを使うことで、強力で実際の業務に柔軟に対応する アプ リケーションを短時間で作成できます。また、SQLには弱点もありますが 、その弱点はdbMAGICを使 うことで補うことができます。また、dbMAGICを使うことで、SQLのメリットを最大限に引き出すことも できます。

ドキュメント内 dbMAGIC Ver8.2 SQLガイド (ページ 88-94)