0

次のクエリを開く DAO レコードセットがあります。

SELECT sd.pointnumber
FROM (sdn INNER JOIN sd ON sdn.filename=sd.filename) 
INNER JOIN o ON sd.oID = o.id
WHERE o.id = [oID] 
And sdn.Line <>  [sdnLine];

テーブルsdには約 500,000 レコードと 30 列があり、テーブルsdnには約 5000 レコードと 4 列があります。テーブルOには 6 つのレコードと 12 列があります。

次のコマンドでレコードセットを開きます。

Dim qdf As QueryDef
Set qdf = CurrentDb.QueryDefs("oSdSdn2")
qdf.Parameters("oID") = oID
qdf.Parameters("sdnLine") = line
Set rs = qdf.OpenRecordset(dbOpenForwardOnly)

データベースを唯一のユーザーとして開いている場合、最初に を呼び出す.MoveNextrs、実行に 1 ~ 2 分かかります。その後、それぞれ.MoveNextが 1 秒以内に発生します。データベースに複数のユーザーがいる場合、それぞれに.MoveNext1 ~ 2 分かかります。

テーブルはsdn.Line、 、o.id、および で既にインデックス付けされていますsd.oID

処理する行の総数を減らすことを期待して、クエリを別の方法で構造化しようとしました。

select pointnumber from
(select pointnumber,filename from sd where oID=[oID]) sd
inner join
sdn
on
sd.filename=sdn.filename
where
sdn.line<>[sdnLine]

これで時間は全く変わりませんでした。特に複数のユーザーがいる場合、このクエリを高速化する方法はありますか?

4

1 に答える 1

0

それはあなたの質問ではありません。それはあなたのテーブルです。フィルターは小さいテーブルにあるため、インデックスは必要ありません。ただし、クエリの使用方法に基づいて、大きなテーブルsdには のインデックスが必要になります。filename

于 2013-05-30T23:11:57.920 に答える