Postgresql GROUP BY在博士后中的表现

Postgresql GROUP BY在博士后中的表现,postgresql,Postgresql,我有一个2M+的大表,记录了大量的列。出于重复数据消除的目的,我打算进行分组。我想知道以下两种策略中哪一种表现更好 按多个列分组列a、列b、列c 添加一个新的列重复数据消除列,该列由使用列a、列b、列c形成的规范化字符串组成,然后按重复数据消除列进行分组。重复数据消除列将预先填充。 我知道我可以运行基准测试,但在开始实施之前,我需要一些理论上的输入。我会对各种查询运行解释计划,以比较成本。这比你在这里得到的任何理论答案都更有价值。让PostgreSQL告诉您它将做什么。我会对各种查询运行解释计划

我有一个2M+的大表,记录了大量的列。出于重复数据消除的目的,我打算进行分组。我想知道以下两种策略中哪一种表现更好

按多个列分组列a、列b、列c 添加一个新的列重复数据消除列,该列由使用列a、列b、列c形成的规范化字符串组成,然后按重复数据消除列进行分组。重复数据消除列将预先填充。
我知道我可以运行基准测试,但在开始实施之前,我需要一些理论上的输入。

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

我会对各种查询运行解释计划,以比较成本。这比你在这里得到的任何理论答案都更有价值。让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);

但是还有很多其他的选择。。。这在很大程度上取决于表、索引的数量等等。。。删除可能会很昂贵,因为我也有过这样的例子:最好从一组唯一的行中创建一个新表,然后删除原始表,并将新表重命名为原始名称。

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

但是还有很多其他的选择。。。这在很大程度上取决于表、索引的数量等等。。。删除可能会很昂贵,因为我也有过这样的例子:最好从一组唯一的行中选择一个新表,然后删除原始表并将新表重命名为原始名称。

看在上帝的份上,选择选项1。不要求助于2,除非您对1有重要的性能选项,并且您已经用尽了所有其他选项(包括索引)来解决它

选项2是个糟糕的主意。实际上,通过实施穷人版的索引,你正在重新发明轮子……糟糕透了

永远不要,永远不要,永远不要,去规范化—这是您在选项2中所做的—在您确定性能问题之前,您的数据用于性能。即使这样,你也不应该这么做


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

看在上帝的份上,选择选项1。不要求助于2,除非您对1有重要的性能选项,并且您已经用尽了所有其他选项(包括索引)来解决它

选项2是个糟糕的主意。实际上,通过实施穷人版的索引,你正在重新发明轮子……糟糕透了

永远不要,永远不要,永远不要,去规范化—这是您在选项2中所做的—在您确定性能问题之前,您的数据用于性能。即使这样,你也不应该这么做

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

另外,签出:另外,签出: