VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 2003/08/28(Thu) 22:06
投稿者魔界の仮面弁士
Eメール
URL
タイトルRe^6: 検索を早くしたい

> > そもそも、『WHERE 回答 like '*ListBox*'』のような部分検索においては、
> > JETの"RushMore Technology"によるクエリー最適化が働きませんので、ほとんど意味はありません。
> LIKEではインデックスが使用されないんですね。
必ずしも、そういうわけではありません。
LIKE 'ListBox*' などであればインデックスが利用されます。


> > # 複雑なSQLでは、SQLが正しく最適化されているかどうかを検証するために、
> > # レジストリの実行プランフラグを有効にして、showplan.outファイルの結果を確認したり、
> > # DAOのISAMStatsメソッド や ADOのJET_SCHEMA_ISAMSTATSスキーマを利用して、
> > # ディスクI/Oやロック頻度について調べてみると良いかもしれません。
> これはJETの話なんでしょうか?
もちろん、JETの話ですよ。


JETクエリの「実行プラン」は、以下のようにして参照できます。

まず、レジストリの
  \\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\(バージョン)\Engines\Debug
というキーに、文字列(REG_SZ)型で JETSHOWPLAN という値を作成し、
そこに ON と書いておきます。
(なお、通常は Debug というキーは存在しないので、無ければ作成してください)

そうすると、クエリの初回実行時に、実行プランの内容が showplan.outという
テキストファイルに出力されるようになりますので、それをメモ帳等で開いて見てください。

# なお、解析処理が終わったら、レジストリ設定を解除しておくのを忘れないようにして下さい。
# そのまま放っておくと、ログがどんどん巨大化していってしまいますから。(^_^;)



それから、「ディスクI/Oやロック頻度」というのは、以下のようにして取得します。

DAOの場合は、
  Debug.Print DBEngine.ISAMStats(0), "ディスク読取数"
  Debug.Print DBEngine.ISAMStats(1), "ディスク書込数"
  Debug.Print DBEngine.ISAMStats(2), "キャッシュからの読取数"
  Debug.Print DBEngine.ISAMStats(3), "キャッシュからの読取数"
  Debug.Print DBEngine.ISAMStats(4), "配置されたロック数"
  Debug.Print DBEngine.ISAMStats(5), "解除されたロック数"
  '以下は、JET 4.0 (DAO 3.6)環境で有効
  Debug.Print DBEngine.ISAMStats(6), "レコードに記憶されたLVS数"
  Debug.Print DBEngine.ISAMStats(7), "共有ページに記憶されたLVS数"
  Debug.Print DBEngine.ISAMStats(8), "排他ページに記憶されたLVS数"
  Debug.Print DBEngine.ISAMStats(9), "LVSのページ数"
  Debug.Print DBEngine.ISAMStats(10),"レコードから移動されたLVS数"
  Debug.Print DBEngine.ISAMStats(11),"未使用のロード済みページ数"
  Debug.Print DBEngine.ISAMStats(12),"これの用途は不明。情報募集中です(汗)"
という感じです。

なお、各統計値をリセットするには、事前に
  DBEngine.ISAMStats 番号, True
を実行してやれば OK です。



また、ADOの場合は、こんな感じです。

    Dim Rs As ADODB.Recordset
    Dim Fld As ADODB.Field

    '(変数 Cn は、Microsoft.JET.OLEDB.4.0 による mdbへの ADODB.Connection)

    Set Rs = Cn.OpenSchema(adSchemaProviderSpecific, , "{8703b612-5d43-11d1-bdbf-00c04fb92675}")
    For Each Fld In Rs.Fields
        Debug.Print Fld.Value, Fld.Name
    Next
    Rs.Close
    Set Rs = Nothing


こちらは、OpenSchemaの実行前に、あらかじめ
    Cn.Properties("Jet OLEDB:Reset ISAM Stats").Value = True
を実行しておくと、毎回、値がリセットされるようになります。
(Falseのままにしておいた場合は、前回の値はリセットされず、値が蓄積されていきます)


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -