我有一个大表(2M +记录载入列)。我打算为重复数据删除目的做一个GROUP BY。我想知道以下两种策略中的哪一种会更好?在Postgres中GROUP BY的性能
- GROUP BY多个列(为col_a,col_b,col_c)
- 添加新列dedup_col包括使用为col_a,col_b,col_c形成归一化的串,然后执行GROUP BY上dedup_col。预先填充dedup_col。
我知道我可以运行基准测试,但我希望在开始实施之前进行一些理论性的输入。
我有一个大表(2M +记录载入列)。我打算为重复数据删除目的做一个GROUP BY。我想知道以下两种策略中的哪一种会更好?在Postgres中GROUP BY的性能
我知道我可以运行基准测试,但我希望在开始实施之前进行一些理论性的输入。
对于上帝的爱,请选择1.不要诉诸#2,除非你有#1认真的表现选择,并且你已经用尽了所有其他选项(包括索引)来解决它。
选项#2是一个可怕的想法。实际上,你正在通过实施一个穷人的索引版本来重塑轮胎......糟透了。
从来没有,永远,去规范化(这就是你正在做的选项2)你的数据的性能,直到你确定了性能问题。即使那样,你可能不应该这样做。
仅供参考:如果您的索引设置正确,则2百万条记录不是一个大数据库。
我会对各种查询运行EXPLAIN PLAN来比较成本。这比任何你在这里得到的理论答案都要有价值。让PostgreSQL告诉你它会做什么。
我通常最终使用的方法是使用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表并重命名新的表以获得原始名称。
另外,请查看:http://www.postgresonline.com/journal/archives/22-Deleting-Duplicate-Records-in-a-Table.html – 2012-02-22 03:36:38