gpt4 book ai didi

sql - 从Redshift数据库中删除所有重复项

转载 作者:行者123 更新时间:2023-12-04 13:39:15 34 4
gpt4 key购买 nike

我有一个非常大的Redshift数据库。记录没有唯一的键或ID。我想用最有效的查询删除所有重复项。

关于典型sql数据库的其他stackoverflow问题建议在该过程中复制表并跳过重复项,但是对于巨型redshift数据库而言,这似乎不是最佳选择。

有更好的解决方案吗?

最佳答案

Redshift要记住的一件事是,删除的记录实际上只是“软”删除,直到运行VACUUM。
-它们保留在表格中,被标记为“忽略”
-只有在真空状态下才将其删除

但是,大型表上的VACUUM实际上比“深层复制”慢得多,散布在其中的删除项通常要慢一些。 (将数据复制到另一个表中,使用GROUP BYDISTINCT消除重复项,用TRUNCATE原始表,然后重新插入数据,或删除原始表并重命名新表。)

对于您为什么实际上可以从“缓慢”的过程中受益的原因,这是一个普遍的道理。

另外,如果两行确实相同,则无法(根据定义)唯一地标识一行。在这种情况下,您无法区分要保留的内容和要删除的内容。

其他RDBMS中的一个“技巧”是在Common Table Expression中使用ROW_NUMBER(),然后从该CTE中删除。 (通过CTE创建唯一标识符,允许您标识要保留或删除的各个行。)不幸的是,Redshift当前不支持从CTE中删除。

在此更改之前,深度复制(使用GROUP BYDISTINCT复制到单独的表)是当前唯一的选择。

即使这样,即使确实有可能从CTE中删除,Deep Copy选项在Redshift中可能仍然更加有效。

编辑:

更正:

如果已删除Redshift表中的任何行,则任何后续VACUUM都会重新处理整个表(无论删除的行在何处或删除的行有多少)。

(在插入后进行真空处理时,但在删除后进行右下处理时,该方法更为复杂。)

我还注意到,深拷贝比VACUUM使用更少的磁盘空间。 (只有在磁盘空间不足时才引起我的注意...)

编辑:

代码示例:

CREATE TABLE blah_temp (
<Exactly the same DDL as the original table, especially Distribution and Sort keys>
)
;

INSERT INTO
blah_temp
SELECT DISTINCT
*
FROM
blah
;

DROP TABLE blah;

ALTER TABLE blah_temp RENAME TO blah;

或者...
CREATE TABLE blah_temp (
<Exactly the same DDL as the original table, especially Distribution and Sort keys>
)
;

INSERT INTO
blah_temp
SELECT
*
FROM
blah
GROUP BY
a, b, c, d, e, f, g, etc
;

TRUNCATE TABLE blah;

INSERT INTO
blah
SELECT
*
FROM
blah_temp
;

DROP TABLE blah_temp;

相关链接: https://docs.aws.amazon.com/redshift/latest/dg/performing-a-deep-copy.html

关于sql - 从Redshift数据库中删除所有重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24512361/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com