かいつまんでJOINとINSERT INTO:INNERとSELECTクエリの2つのテーブルを結合MS-アクセス:SQL WHERE遅い
は、INSERT INTOを経由して新しいテーブルに挿入されます。このクエリは20秒以内に終了しますが、SELECT部分にWHERE条件を追加するとクエリがフリーズします。
詳細:
Iは、2つのテーブル(i = 1,2)
Table i : Tab_i
ID_i (Long, Indexed, Duplicates possible)
MyDate (Date)
Field_1 (...)
...
Field_N (...)
を持つ2つのテーブル
Table Tab_MATCH
ID_1 (Long, Indexed, Duplicates possible)
ID_2 (Long, Indexed, Duplicates possible)
を比較した場合、私はマッチングIDを格納する表Tab_MATCHを作成
2つのテーブルTab_1とTab_2の結合を介して一致が行われ、一致するIDがテーブルTab_MATCHに挿入されます
INSERT INTO
Tab_MATCH
SELECT
Tab_1.ID_1,
Tab_2.ID_2,
FROM
Tab_1
INNER JOIN
Tab_2
ON
(Tab_1.Field_1 = Tab_2.Field_1) AND
(...) AND
(Tab_1.Field_N = Tab_2.Field_N)
この手順は約20秒以内に正常に動作します。 次に、Tab_2の日付に制約を追加したいとします。 2014年3月(2014年3月1日)の第一の前にエントリのみを考慮すると、私は
INSERT INTO
Tab_MATCH
SELECT
Tab_1.ID_1,
Tab_2.ID_2,
FROM
Tab_1
INNER JOIN
Tab_2
ON
(Tab_1.Field_1 = Tab_2.Field_1) AND
(...) AND
(Tab_1.Field_N = Tab_2.Field_N)
WHERE
Tab_2.MyDate < #3/1/2014#
追加このクエリは今FOREVER実行されます。 select with date制約だけを実行すると、約20秒で終了しますが、挿入の種類がフリーズします!
私はここで何が欠けていますか?このプロシージャまたは他のもので各結合エントリに関連するテーブルスキャンはありますか?そして、この保存されたクエリを使用して、元のクエリでTab_2を交換
SELECT *
FROM Tab_2
WHERE MyDate < #3/1/2014#
を:
MS-Accessのミステリー。 AccessにはEXPLAIN PLANメカニズムがあるので、そのようなものをデバッグするのは難しいです。コンパクト/データベースの修復を試みましたか? –
はい、その痛み...私はすでに圧縮/修復(数回)また、結合のWHERE句を直接追加しようとしました。... INNER JOIN (SELECT * FROM Tab_2 WHERE Tab_2.MyDate <#3/1/2014#)... ...しかし改善はありません... – HeXor
私はちょうどDAO.RecordsetとしてSELECTクエリ上のVBAループを介して挿入をしようとした(はい、私はこの時点で既に...)とここにもあるエントリの数を計算するときにフリーズします。 'Dim rs as DAO.Recordset; set rs = CurrentDb.OpenRecordset( "SELECT ..."); rs.MoveFirst; rs.MoveLast; Debug.Print rs.RecordCount; rs.Close' 'rs.MoveLast'コマンドが再びフリーズします... WHERE句をドロップすると、正常に動作します。 – HeXor