2017-05-08 59 views
2

長話短說:MS-訪問:SQL JOIN和INSERT INTO與WHERE慢

SELECT查詢與INNER JOIN兩個表的插入通過插入一個新表。儘管此查詢在20秒內完成,但在SELECT部分​​中添加WHERE條件會凍結查詢!


詳情:

我有

Table i : Tab_i 

ID_i (Long, Indexed, Duplicates possible) 
MyDate (Date) 
Field_1 (...) 
... 
Field_N (...) 

我創建了一個表Tab_MATCH存儲比較這兩個表

Table Tab_MATCH 
ID_1 (Long, Indexed, Duplicates possible) 
ID_2 (Long, Indexed, Duplicates possible) 
當匹配ID的兩個表(I = 1,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日)的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# 

這個查詢現在一直運行。如果我只做了帶日期約束的選擇,它也在約20秒內完成,但插入類型凍結!

我在這裏錯過了什麼?是否有任何表格掃描涉及此過程或其他任何加入條目? (使用的MS Access 2016(32位))

+0

MS-Access的misteries。很難調試這種事情,因爲Access沒有EXPLAIN PLAN機制。你有沒有試圖壓縮/修復你的數據庫? –

+0

是的,它的痛苦...我已經壓縮/修復(幾次),並試圖直接在連接中添加WHERE子句'... INNER JOIN (SELECT * FROM Tab_2 WHERE Tab_2.MyDate <#3/1/2014#)...'但沒有改進... – HeXor

+0

我只是試圖通過VBA循環插入SELECT查詢作爲DAO.Recordset(是的,我在這一點上已經...),也在這裏它只在計算條目數時凍結[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

創建並保存這樣的查詢:

SELECT * 
FROM Tab_2 
WHERE MyDate < #3/1/2014# 

然後在代替原始查詢Tab_2這個保存的查詢。

+0

發佈的代碼僅僅是一個例子,當然嵌入到更復雜的上下文中。這意味着WHERE子句是動態的,需要應用不同的條件。我有一個VBA腳本,在多個表上運行多個比較,運行良好。所以我想使用ORIGINAL表(我將受限於* .accdb文件的2GB文件大小限制),而不是爲每個比較創建一個tmp表。正如上面的其他評論所述,我想了解WHERE子句對查詢的影響...... – HeXor

+0

我剛試過你的方法,它沒有提高查詢速度,也就是凍結。我也沒有看到外部查詢或我的查詢中添加確切的代碼之間的區別。你能評論你爲什麼會期望有所不同嗎? – HeXor

+0

在嘗試進行任何連接之前強制訪問以篩選Tab_2,因此要比較的數據少得多。真是一個古老的絕招。如果這種凍結,我猜其他事情正在發生;它不能成爲凍結Access的標準。 – Gustav