TO:DRS関係者各位
FROM:油井コンサルティング 岡本
DATE:9/4/2002
RE:D00016 「SQL Server7.0」使用時のインデックスに関する注意事項


**************************************

FROM:油井コンサルティング 岡本
DATE:5/24/2001
RE:「SQL Server7.0」でのDRS環境でのインデックス構成変更のお願い


「SQL Server7.0」でDRSを使用しているYC直販ユーザーで「SQL Server7.0」の
バグらしき現象に起因するDRS使用時の不具合現象が見つかりました。


下記に、不具合現象、原因調査の為のテスト内容、考察、対処方法を書きます。


1.不具合現象

月末計算時に特定の患者のカルテ情報がまったく読み込めず、レセプトが
印字されない。

この現象は、「dbman32.exe」内でテーブル「comeh_dbf」に対して下記のSQL文を
実行しても対応するレコードがテーブル「comeh_dbf」より読み込めない為に発生
していた。(実際には、テーブル「comeh_dbf」内に対応するレコードは、存在する。)


「select * from comeh_dbf where RECNO in(1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126)」


2.原因調査の為のテスト内容

SQL Server7.0付属のクライアントソフトの「クエリアナライザ」を使用して
テストしたところ、下記の事がわかりました。

1)上記と同じSQL文を実行しても指定したレコードが読み込めない現象が
起こる。

2)上記SQL文中の一部の数値(1112と1126を入れ替えました)を入れ替えた
下記のSQL文の場合は、対象レコードが読み込める。

「select * from comeh_dbf where RECNO in(1126,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1112)」

3)上記と同じSQL文の最後にブランクを3文字追加すると指定したレコードが
読み込める。

「select * from comeh_dbf where RECNO in(1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126)   」

4)テーブル「comeh_dbf」のインデックス「comeh_dbf_recno」をクラスタ化
インデックスにすると、問題が発生するSQL文でも対象のレコードを正常に読み
込める。

インデックス「comeh_dbf_recno」をクラスタ化インデックスにした場合と
非クラスタ化インデックスにした場合で「クエリアナライザ」で表示される
「実行プラン」の内容が異なります。

非クラスタ化インデックスにした場合の「実行プラン」の方が複雑でした。


3.考察

本来、データーベースサーバーソフトでは、インデックスの有無、インデックス
構成が違っていても同じSQL文を実行した場合は、同じ結果にならなければ
なりません。(検索にかかる時間は、インデックスの有無、インデックス構成
のより大きくかわりますが。)

しかし、今回の場合、インデックス「comeh_dbf_recno」のクラスタ化、
非クラスタ化により同じSQL文で同じ結果になりません。

これは「SQL Server7.0」本体のバグだと思われます。

非クラスタ化インデックスにした場合の「実行プラン」のどこかにバグがある
のだと思われます。


4.対処方法

「SQL Server7.0」内のすべてのDRS用テーブルについている、すべての
レコード番号用のインデックスをクラスタ化インデックスに変更してください。

レコード番号用のインデックスの名称は、「テーブル名+「_recno」」になって
ます。(例 テーブル「comeh_dbf」の場合、「comeh_dbf_recno」になっている。)

インデックスをクラスタ化インデックスに変更するには、
「SQL Server Enterprise Maneger」の「インデックスの管理」画面で行います。

以上