Access 2007:导致大量性能损失的子查询

时间:2015-08-04 17:55:14

标签: sql ms-access ms-access-2007

我正在构建一个查询来搜索与15列以上的表中的任意数量的字段匹配的记录。 (给出输入的所有字段必须匹配。)

然而,原始表格设计得很糟糕,在某些情况下,同样的东西有超过10个字段。 (使用Street_11之类的名称。)我已将数据分成多个表格,以便Street_2Street_12现在全部标记在Street_2下的单独表格中,仅包含该列和{ {1}},取自主表的主键。 (两者之间没有正式关系,但辅助表中的fileID用作外键。)

在规范化工作之前,搜索表单正在使用this query。虽然不是最佳的,但它至少是功能性的。我之后删除了搜索fileIDStreet_X字段的细分,将其替换为子查询:

Block_X

以上查询搜索较小的表。但是,当在主查询中包含这些内容时(在WHERE ( [Map index].fileID IN ( SELECT fileID FROM [fileID-Street] WHERE [fileID-Street].Street_2 LIKE "*" & [Forms]![DW_Form]![Street] & "*" ) OR ([Forms]![DW_Form]![Street] Is Null) ) AND ( [Map index].fileID IN ( SELECT fileID FROM [fileID-blockLot] WHERE [fileID-blockLot].Block LIKE "*" & [Forms]![DW_Form]![Street] & "*" ) OR ([Forms]![DW_Form]![Block] Is Null) ) 和当前FROM子句之间,当前WHERE替换为WHERE)我遇到了真正令人震惊的损失性能;仅包括Street子句(删除原始查询的相关部分)将处理时间从~5s提高到~45s。添加两个子查询会将搜索时间减慢到超过三分钟。

此时很清楚,我可能会以错误的方式解决这个问题。我能够找到的信息(例如here)似乎表明子查询可能在每个记录的整个子表上运行。 应该我在这种情况下做什么?

1 个答案:

答案 0 :(得分:1)

尝试使用连接而不是子查询,它通常表现更好。 例如:

SELECT ...
FROM [Map index] LEFT OUTER JOIN [fileID-Street] 
ON [Map index].fileID=[fileID-Street].fileID
WHERE ... AND [fileID-Street].Street_2 LIKE '*" & [Forms]![DW_Form]![Street] & "*'