【问题标题】:Performance of GROUP BY in PostgresGROUP BY 在 Postgres 中的表现
【发布时间】:2012-02-22 03:11:35
【问题描述】:

我有一个大表(200 万多条记录和大量列)。我打算为重复数据删除目的进行 GROUP BY。我想知道以下两种策略中哪一种效果更好?

  1. GROUP BY 多列(col_a, col_b, col_c)
  2. 添加一个由使用 col_a、col_b、col_c 形成的规范化字符串组成的新列 dedup_col,然后对 dedup_col 执行 GROUP BY。 dedup_col 将预先填充。

我知道我可以运行基准测试,但在开始实施之前我想要一些理论输入。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    看在上帝的份上,请选择选项 1。除非您对 #1 有严格的性能选项,并且您已经用尽所有其他选项(包括索引)来解决它,否则不要诉诸 #2。

    选项 #2 是个糟糕的主意。实际上,您正在通过实施一个穷人版本的索引来重新发明轮子......非常糟糕。

    从不、从不、从不、对性能数据进行非规范化(这就是您在选项 2 中所做的),直到您发现性能问题。即使那样,你也可能不应该这样做。

    仅供参考:如果您的索引设置正确,200 万条记录并不是一个大数据库。

    【讨论】:

      【解决方案2】:

      我会针对各种查询运行 EXPLAIN PLAN 以比较成本。这比你在这里得到的任何理论答案都更有价值。让 PostgreSQL 告诉你它会做什么。

      【讨论】:

        【解决方案3】:

        我通常最终使用的方法是使用 ctid 键。例如:

        delete from yourtable
        where ctid not in (
        SELECT  MAX(dt.ctid)
        FROM yourtable As dt
        GROUP BY dt.col_a, dt.col_b, dt.col_c);
        

        但是还有很多其他选项...很大程度上取决于表、索引的数量等等...删除可能会很昂贵,因为我也有一些实例可以更好地创建一个从唯一行中选择新表,然后删除原始表并将新表重命名为原始名称。

        【讨论】:

        猜你喜欢
        • 2021-09-09
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        • 2023-04-08
        • 2016-08-14
        • 1970-01-01
        • 2020-02-08
        • 2014-09-28
        相关资源
        最近更新 更多