【问题标题】:Access 2007: Subqueries causing massive performance lossAccess 2007:导致大量性能损失的子查询
【发布时间】:2015-08-04 17:55:14
【问题描述】:

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

但是,原始表的设计很糟糕,在某些情况下,同一事物有超过十个字段。 (名称如 Street_11。)我已将数据分成多个表,以便 Street_2Street_12 现在都标记在单独的表中的 Street_2 下,仅包含该列和 fileID,这是采用从主表的主键。 (两者之间没有正式的关系,尽管辅助表中的fileID 用作外键。)

在规范化工作之前,搜索表单使用的是this query。虽然不是最佳的,但它至少是功能性的。我已经删除了搜索Street_XBlock_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


    【解决方案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] & "*'
    

    【讨论】:

    • 这似乎成功了,至少在速度方面;您在示例中使用left outer join 是否有任何特殊原因,或者是任意选择的?
    • ...实际上,这给了我完全错误的结果。我正在尝试过滤,以便只有具有出现在辅助表中的 fileID 的列才会出现在结果中。使用JOIN [fileID-Street] AS fis ON [Map index].fileID = fis.fileID 技术会在输出中产生更多项目。
    • 对不起,我误会了。尝试将LEFT OUTER JOIN 更改为INNER JOIN。您还可以将[fileID-Street].Street_2 LIKE '*" & [Forms]![DW_Form]![Street] & "*' 移动到ON 子句。例如:FROM [Map index] INNER JOIN [fileID-Street] ON [Map index].fileID=[fileID-Street].fileID AND [fileID-Street].Street_2 LIKE '*" & [Forms]![DW_Form]![Street] & "*'
    • 我担心这些连接会产生大量具有相同fileID 的记录,因为它是一对多的关系。对于给定的搜索,我可能只有六个左右,但如果我添加第二个连接,就会增加一百多条记录。有什么办法可以对抗这种情况吗?添加 DISTINCT 子句似乎删除了一些实际上 不同的记录,至少如果我在非不同结果上运行的 Find Duplicates 查询是可信的。 (它在非明显结果中显示了约 200 个重复项。DISTINCT 删除了约 4000 个结果。)
    • 请参阅this paste 中的表格,以更好地解释我想要完成的工作。
    猜你喜欢
    • 1970-01-01
    • 2014-06-26
    • 2020-11-18
    • 2011-03-04
    • 2019-11-05
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多