【发布时间】:2015-08-04 17:55:14
【问题描述】:
我正在构建一个查询来搜索与具有 15 列以上的表中任意数量的字段匹配的记录。 (给出输入的所有字段都必须匹配。)
但是,原始表的设计很糟糕,在某些情况下,同一事物有超过十个字段。 (名称如 Street_11。)我已将数据分成多个表,以便 Street_2 到 Street_12 现在都标记在单独的表中的 Street_2 下,仅包含该列和 fileID,这是采用从主表的主键。 (两者之间没有正式的关系,尽管辅助表中的fileID 用作外键。)
在规范化工作之前,搜索表单使用的是this query。虽然不是最佳的,但它至少是功能性的。我已经删除了搜索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 替换为AND)我遇到了真正令人震惊的性能损失;仅包括 Street 子句(删除了原始查询的相关部分)将处理时间从 ~5s 提高到 ~45s。添加两个子查询会将搜索时间减慢到三分钟以上。
在这一点上,很明显我可能走错了路;我能够找到的信息(例如here)似乎表明子查询可能在每个记录的整个子表上运行。在这种情况下我应该怎么做?
【问题讨论】:
标签: sql ms-access ms-access-2007