我有一个大表(2M +带有大量列的记录)。我打算为重复数据删除目的进行GROUP BY。我想知道以下哪两种策略会表现更好?
我知道我可以运行基准测试,但在开始实现之前我想要一些理论输入。
答案 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表并将新表重命名为原始名称。