ちゃむ今回から、ダイレクトソートに関する検証を行なう。ダイレクトソートとは、ディスクソートを行なうときのアルゴリズムの一つである。<ダイレクトソートとは>ディスクソートでダイレクトソートを使用しない場合は、データをデータベースバッファに読み込み、一時表領域への書き出しはDBWRで行なう。ダイレクトソートを使用する場合は、一時表領域へ書き出すためのバッファを用意してデータの書き出しを行なうので、DBWRの負荷を軽減させることができるとともに、データベース・バッファに対する競合の軽減やヒット率の向上にも効果がある。以下にダイレクトソートを使用する場合としない場合の違いを図に示す。上記の文章を読むと、ダイレクトソートは非常によい機能のように思われるかもしれない。能はOracle8までは、sort_direct_writesというパラメータでfalse,true,auto(デフォルト)のいずれかを設定して、ダイレクトソートを使用するかしないかを決めていた。Oracle8iでは、sort_direct_writesというパラメータは廃止され、ディスクソート処理はすべて「ダイレクトソート」になった。今回の検証は、ダイレクトソートを使用するときと使用しないときで、データベース・バッファ上でどのような動きの違いがあるかを実際に見てみる。この検証は、Oracle8で行った(Oracle8iでは、すべてのソート処理がダイレクトソートで行われるので、動きの違いを検証することはできない)。データベース・バッファの動きを見るために、X$BHを使用する。HEADER」の略である。X$BHで検索されるデータ数は、初期化パラメータのdb_block_buffersの値に一致する。一致!!X$BHには、FILE#という列があり、FILE#はV$DATAFILEのFILE#と一致する。そのファイル番号からどのデータファイルのデータがデータベース・バッファ上に載っているのかがわかる。今回は、ソートで使用するテーブルスペースのデータファイル番号は2なので、以下のようなSQL文を発行することにより、ソートセグメントのデータブロックの数を確認することができる。FILE#=2;上記のSQL文を1秒おきに発行し、その動きを見る。今回の検証には、弊社「インサイトテクノロジー」が精魂を込めて開発したインタプリタ言語「POPSQL」を用いて、それぞれの動きを確認した。「パフォーマンスインサイト」の中で使用されている言語です。監視ジョブなんかもちょー簡単に作ることができます。囲むと変数の値が展開される。1ENDLOOP-----------------------POPSQL終わり--------------------------<検証結果><ダイレクトソートではない処理の検証結果>以下が1秒毎のバッファ数の推移(抜粋)であるが、200個のデータベース・バッファがすべて、ソートセグメントで埋め尽くされてしまった。これが、ヒット率の低下及び、DBWR負荷が増大する原因である。|192||198||196||200||200||200|<ダイレクトソート処理の検証結果>以下がバッファ数の推移(抜粋)であるが、1ブロックだけデータベース・バッファに載っている様子がうかがえる。違いは一目瞭然であろう。|1||1||1||1||1||1|次回は、sort_direct_writes=autoで検証を行う。このメールが皆様の元に届く頃には、私は「NET&COM」のブースにいるでしょう。時間の許す限り、是非、「インサイトテクノロジー」のブースにお立ち寄り下さい。本文中でも触れた「パフォーマンスインサイト」を出展しておりますので、是非、このツールの良さを体感していって下さい。前回のOOWのときと違って、一人一人のお客様とお話したいと思っておりますので、よろしくお願いします。モンキーターン今回は、「整合性制約の管理」のつづきで「整合性制約の状態」についてお送りしよう。NOVALIDATE」に設定して動きを見てもらった。VALIDATE」に設定したときの動きを見てみよう。VALIDATE」の状態とは、既存のデータはチェックされた後にデータの変更が禁止されるのである。データの変更はないが既存のデータの一意性は保証したい場合に、用いられる。検証で使うテーブルを作成する。VALIDATE」の状態になるのである。レコードが選択されませんでした。設定すると主キーに付いていた索引は、削除されるのである。エラーが発生しました。制約(SCOTT.PK_WORK)が使用禁止および検査対象の表で挿入/更新/削除はできません。エラーが発生しました。制約(SCOTT.PK_WORK)が使用禁止および検査対象の表で挿入/更新/削除はできません。エラーが発生しました。制約(SCOTT.PK_WORK)が使用禁止および検査対象の表で挿入/更新/削除はできません。状態に設定すると、既存のデータの一意性をチェックした後は、表に対する変更(DML文)を禁止されているのが確認できる。VALIDATE」状態の特徴は、表のデータに対して変更は行われないことであるが、デメリットとして、既存のデータの一意性は保証したいときに、一意性制約を作成すると作成されていた索引が作成されないということである。この索引を利用した検索ができないということである。————————-「どっぷり入門生活」では、基本的な質問をお待ちしています。このようなテーマでやってほしい等の要望がございましたら、メールでどしどしお寄せください。近々「どっぷり入門生活」の内容&やり方を変更しようと思っています。テーマは持たずに1回読み切りタイプや、もっと実用的な入門タイプ等を考えています。読者の皆様の、ご意見をお聞かせください。