【问题标题】:How to write a fast counting query for a large table?如何为大表编写快速计数查询?
【发布时间】:2011-06-14 01:22:59
【问题描述】:

我有两个表,Table1 有 100,000 行,Table2 有 400,000 行。两个表都有一个名为电子邮件的字段。我需要在 Table1 中插入一个新字段,该字段将指示 Table1 中每一行的电子邮件在 Table2 中出现的次数。

我为 Excel 编写了一个二进制计数函数,它可以在几秒钟内对这个数据样本执行此操作。是否有可能在 Access 中如此快速地执行它?

谢谢。

【问题讨论】:

    标签: ms-access ms-access-2007


    【解决方案1】:

    此查询是否表达了您想从 Table2 中找到的内容?

    SELECT Email, Count(*) AS number_matches
    FROM Table2
    GROUP BY Email;
    

    如果这是您想要的,我不明白您为什么要将 number_matches 存储在另一个表中。只需在需要 number_matches 的任何时间/任何时间使用此查询。

    您应该有一个关于 Table2 的电子邮件索引。

    更新:我提供这个示例来说明 Count() 与 GROUP BY 对索引字段的速度。

    SELECT really_big_table.just_some_text, Count(*) AS CountOfMatches
    FROM really_big_table
    GROUP BY really_big_table.just_some_text;
    

    really_big_table 包含 10,776,000 行。这个大小远远超出了您通常期望在实数 Access (Jet/ACE) 数据库中找到的大小。我保留它以对不同的数据库操作进行极端压力测试。

    字段 just_some_text 已编入索引。使用该索引,查询将在一分钟内完成。我没有费心更精确地计时,因为我只对与 OP 的类似查询对包含少于我的行数的 5% 的表所花费的几分钟进行粗略比较感兴趣。

    我不明白为什么 OP 的查询相比之下要慢得多。我在这里的目的是警告其他读者不要忽视这种方法。以我的经验,这种操作的速度从可接受到极快......只要数据库引擎有一个合适的索引可以使用。至少在您在表之间重复复制值之前尝试一下。

    【讨论】:

    • +1:我完全同意。查询将使用索引快速运行。应该不需要存储结果。它应该比 Excel 函数快得多。但你应该加入 table1。
    • 我需要在每封电子邮件旁边存储匹配的数量,但它必须存储在每一行,因为还有其他因素我也会计算(表 1 有 100,000 个唯一交易,这就是为什么我需要每行的数字)。
    • Table1 包含 100,000 个唯一事务,Table2 包含 400,000 个唯一事务。我需要将电子邮件计数分配给表一中的每一个 100k 事务。
    • @fomoz:你还没有解释为什么需要存储它。您可以随时显示它,但不必将其存储在表格中。它是重复数据,可以从其他数据中推导出来,并且在更新后很快就会过时。如果您使用的是 A2010,当然,您可以使用表级数据宏(如触发器)来使其保持最新状态,但何必呢?每次需要时进行即时计算,这样的计算成本应该非常低。
    • “我想导出它”不是需要存储它的原因。您可以像导出表格内容一样轻松地导出查询结果。
    猜你喜欢
    • 2012-10-16
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多