长话短说: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位))
MS-Access的misteries。很难调试这种事情,因为Access没有EXPLAIN PLAN机制。你有没有试图压缩/修复你的数据库? –
是的,它的痛苦...我已经压缩/修复(几次),并试图直接在连接中添加WHERE子句'... INNER JOIN (SELECT * FROM Tab_2 WHERE Tab_2.MyDate <#3/1/2014#)...'但没有改进... – HeXor
我只是试图通过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