2017-05-08 14 views
2

かいつまんで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# 

を:

+0

MS-Accessのミステリー。 AccessにはEXPLAIN PLANメカニズムがあるので、そのようなものをデバッグするのは難しいです。コンパクト/データベースの修復を試みましたか? –

+0

はい、その痛み...私はすでに圧縮/修復(数回)また、結合のWHERE句を直接追加しようとしました。... INNER JOIN (SELECT * FROM Tab_2 WHERE Tab_2.MyDate <#3/1/2014#)... ...しかし改善はありません... – HeXor

+0

私はちょうど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

答えて

0

このようなクエリを作成して保存(MS Accessの2016(32ビット)を使用)。

+0

投稿されたコードは単なる例であり、もちろんより複雑なコンテキストに組み込まれています。つまり、WHERE句は動的で、異なる条件で適用する必要があります。私は複数のテーブルの別の後にいくつかの比較を実行するVBAスクリプトを持って、うまく動作します。だから私はORIGINALテーブル(私は* .accdbファイルに2GBのファイルサイズの制限によって制限される)を使用すると、各比較のためのtmpテーブルを作成する代わりにしたいと思います。上記の他のコメントで述べたように、私はWHERE句がクエリに及ぼす影響を理解したいと思います... – HeXor

+0

私はあなたのアプローチを試してみましたが、クエリスピードが向上しなかった、つまりフリーズしました。私はまた、外部クエリとの違いや、クエリ内の正確なコードの追加を見ていない。違いを期待する理由をコメントできますか? – HeXor

+0

これは、結合を試みる前にTab_2をフィルタリングするように強制します。本当に古いトリック。それが凍結すれば、何か他のことが起こっていると思います。アクセスをフリーズする基準にはなりません。 – Gustav

関連する問題