Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance MS Access:SQL连接并插入到WHERE slow中_Performance_Ms Access_Join_Sql Insert - Fatal编程技术网

Performance MS Access:SQL连接并插入到WHERE slow中

Performance MS Access:SQL连接并插入到WHERE slow中,performance,ms-access,join,sql-insert,Performance,Ms Access,Join,Sql Insert,长话短说: 具有两个表的内部联接的SELECT查询通过INSERT into插入到新表中。当此查询在20秒内完成时,在“选择零件”中添加WHERE条件将冻结查询 详情: 我有两张表I=1,2 Table i : Tab_i ID_i (Long, Indexed, Duplicates possible) MyDate (Date) Field_1 (...) ... Field_N (...) 在比较两个表时,我创建了一个表选项卡来存储匹配的ID Table Tab_MATCH ID_1

长话短说:

具有两个表的内部联接的SELECT查询通过INSERT into插入到新表中。当此查询在20秒内完成时,在“选择零件”中添加WHERE条件将冻结查询

详情:

我有两张表I=1,2

Table i : Tab_i

ID_i (Long, Indexed, Duplicates possible)
MyDate (Date)
Field_1 (...)
...
Field_N (...)
在比较两个表时,我创建了一个表选项卡来存储匹配的ID

Table Tab_MATCH
ID_1 (Long, Indexed, Duplicates possible)
ID_2 (Long, Indexed, Duplicates possible)
匹配通过两个表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月1日3/1/2014之前的条目,因此我添加了

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位创建并保存如下查询:

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

然后用保存的查询替换原始查询中的Tab_2。

MS Access的错误序列。调试这种东西很困难,因为Access没有解释计划机制。你试过压缩/修复你的数据库吗?是的,很痛苦。。。我已经压缩/修复了好几次,还试图直接在连接中添加WHERE子句。。。内部联接从选项卡2中选择*,其中选项卡2.MyDate<2014年3月1日。。。但没有改进…我只是尝试通过VBA循环将SELECT查询作为DAO进行插入。记录集是的,我已经在这一点上了。。。在这里,当只计算DAO.Recordset中的条目数时,它会冻结;设置rs=CurrentDb.OpenRecordsetSELECT。。。;首先是卢布;r.MoveLast;调试。打印rs.RecordCount;rs.关闭rs.MoveLast命令再次冻结。。。删除WHERE子句也很好…制作一个临时表,这是您的最佳选择。执行INSERT,但不使用WHERE子句,而是使用ID_1、ID_2和mydate列。然后删除所有与日期不匹配的记录,或者使用WHERE子句插入另一个表中。如果你明白我的意思,我会写一个合适的答案是的,这可能会有所帮助,但问题总是隐藏在更大的上下文中,在多个表上进行多重比较。我将测试这个程序。但总的来说,我想了解在这里插入和不插入的SELECT之间的区别,WHERE子句扮演的角色,以及为什么它将插入冻结到。。。选择内部连接。。。哪里查询,这不是一项非常奇特的任务,而是一项标准任务……发布的代码只是一个示例,当然嵌入到更复杂的上下文中。这意味着WHERE子句是动态的,需要在不同的条件下应用。我有一个VBA脚本,在多个表上运行多次比较,运行良好。所以我想使用原始表,我将受到*.accdb文件的2GB文件大小限制,而不是为每次比较创建一个tmp表。正如上面的其他评论所述,我想了解WHERE子句对查询的影响……我只是尝试了你的方法,但没有提高查询速度,即也冻结了。我也看不出外部查询与在查询中添加精确代码之间的区别。你能解释一下为什么会有差异吗?在尝试任何连接之前,它会强制访问filter Tab2,因此要比较的数据要少得多。真是个老把戏。我想,如果这一切冻结了,就会有别的事情发生;它不能成为冻结访问的标准。