次のクエリを開く 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)
データベースを唯一のユーザーとして開いている場合、最初に を呼び出す.MoveNextとrs、実行に 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]
これで時間は全く変わりませんでした。特に複数のユーザーがいる場合、このクエリを高速化する方法はありますか?