2017-05-08 33 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