2012-02-22 26 views
0

我有一个大表(2M +记录载入列)。我打算为重复数据删除目的做一个GROUP BY。我想知道以下两种策略中的哪一种会更好?在Postgres中GROUP BY的性能

  1. GROUP BY多个列(为col_a,col_b,col_c)
  2. 添加新列dedup_col包括使用为col_a,col_b,col_c形成归一化的串,然后执行GROUP BY上dedup_col。预先填充dedup_col。

我知道我可以运行基准测试,但我希望在开始实施之前进行一些理论性的输入。

回答

3

对于上帝的爱,请选择1.不要诉诸#2,除非你有#1认真的表现选择,并且你已经用尽了所有其他选项(包括索引)来解决它。

选项#2是一个可怕的想法。实际上,你正在通过实施一个穷人的索引版本来重塑轮胎......糟透了。

从来没有,永远,去规范化(这就是你正在做的选项2)你的数据的性能,直到你确定了性能问题。即使那样,你可能不应该这样做。

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

3

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

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表并重命名新的表以获得原始名称。

+0

另外,请查看:http://www.postgresonline.com/journal/archives/22-Deleting-Duplicate-Records-in-a-Table.html – 2012-02-22 03:36:38