我正在构建一个查询来搜索与15列以上的表中的任意数量的字段匹配的记录。 (给出输入的所有字段必须匹配。)
然而,原始表格设计得很糟糕,在某些情况下,同样的东西有超过10个字段。 (使用Street_11之类的名称。)我已将数据分成多个表格,以便Street_2
到Street_12
现在全部标记在Street_2
下的单独表格中,仅包含该列和{ {1}},取自主表的主键。 (两者之间没有正式关系,但辅助表中的fileID
用作外键。)
在规范化工作之前,搜索表单正在使用this query。虽然不是最佳的,但它至少是功能性的。我之后删除了搜索fileID
和Street_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)似乎表明子查询可能在每个记录的整个子表上运行。 应该我在这种情况下做什么?
答案 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] & "*'