Postby中GROUP BY的表现

时间:2012-02-22 03:11:36

标签: postgresql

我有一个大表(2M +带有大量列的记录)。我打算为重复数据删除目的进行GROUP BY。我想知道以下哪两种策略会表现更好?

  1. GROUP BY多列(col_a,col_b,col_c)
  2. 添加新列dedup_col,其中包含使用col_a,col_b,col_c形成的规范化字符串,然后在dedup_col上执行GROUP BY。 dedup_col将预先填充。
  3. 我知道我可以运行基准测试,但在开始实现之前我想要一些理论输入。

3 个答案:

答案 0 :(得分:3)

我在各种查询上运行EXPLAIN PLAN来比较成本。这比你在这里获得的理论答案更有价值。让PostgreSQL告诉你它会做什么。

答案 1 :(得分:3)

对于对上帝的爱,请使用选项1.除非你有#1的严肃表现选项并且你已经用尽所有其他选项(包括索引)来解决它,否则不要求助于#2。

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

永远,永远,永远,在您发现性能问题之前,对您的数据进行去标准化(这是您在选项2中所做的)。即便如此,你可能不应该这样做。

仅供参考:如果您正确设置了索引,那么2百万条记录不是一个大数据库。

答案 2 :(得分:0)

我通常最终使用的方法是使用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);

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