次のクエリを開く 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 秒以内に発生します。データベースに複数のユーザーがいる場合、それぞれに.MoveNext
1 ~ 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]
これで時間は全く変わりませんでした。特に複数のユーザーがいる場合、このクエリを高速化する方法はありますか?