红移中的长真空

Posted

技术标签:

【中文标题】红移中的长真空【英文标题】:Long vacuums in redshift 【发布时间】:2018-01-09 15:27:28 【问题描述】:

我正在尝试为 Redshift 中的一些大表运行 VACUUM REINDEX。当我在 SQLWorkbenchJ 中运行其中一个真空吸尘器时,它永远不会完成并在大约 2 小时后返回由对等方重置的连接。当我使用类似这样的方式运行真空吸尘器时,Python 中实际上会发生同样的事情:

conn_string = "postgresql+pg8000://%s:%s@%s:%d/%s" % (db_user, db_pass, host, port, schema)
conn = sqlalchemy.engine.create_engine(conn_string,
                                       execution_options='autocommit': True,
                                       encoding='utf-8',
                                       connect_args="keepalives": 1, "keepalives_idle": 60,
                                                             "keepalives_interval": 60,
                                               isolation_level="AUTOCOMMIT")
conn.execute(query)

有没有一种方法可以使用 Python 或 SQLWorkbenchJ 运行这些查询?我希望它们每个至少持续一个小时。这是预期的行为吗?

【问题讨论】:

检查表没有被锁定(检查锁)。从 linux 服务器或连接更稳定的设备上运行您的真空吸尘器 @JonScott 嗨!我实际上是从 linux 服务器运行 python 脚本,我知道表没有被锁定,因为我实际上看到 VACUUM REINDEX 从 AWS 控制台运行。 【参考方案1】:

简答

根据https://docs.aws.amazon.com/redshift/latest/dg/r_VACUUM_command.html,您可能需要在您的python 脚本中添加一种机制,以便在重新索引失败时重试

如果 VACUUM REINDEX 操作在完成之前终止,则下一个 VACUUM 在执行完全真空操作之前恢复重新索引操作。

但是...

需要注意的几件事(如果您已经知道,我深表歉意)

redshift 中的表可以有 N 个排序键(数据排序依据的列),Redshift 仅支持 2 种排序样式 复合:你真的在排序 基于第一个排序列,然后基于第二个,... Interleaved: 表格将按所有排序列进行排序(https://en.wikipedia.org/wiki/Z-order_curve),有些人在不确定表格将如何使用时会选择这种样式。然而,它本身就有很多问题(这里有更多可靠的文档https://aws.amazon.com/blogs/big-data/amazon-redshift-engineerings-advanced-table-design-playbook-compound-and-interleaved-sort-keys/,其中通常倾向于使用复合排序)

那么这如何回答这个问题呢?

如果您的表使用复合排序或根本没有排序 VACUUM REINDEX 根本不需要,它没有任何价值

如果您的表使用交错,您需要首先检查是否需要重新索引?示例查询

SELECT tbl AS table_id,
   (col + 1) AS column_num, -- Column in this view is zero indexed
   interleaved_skew,
   last_reindex
FROM svv_interleaved_columns
如果 skew 的值为 1.0,你肯定不需要 REINDEX

把所有东西放在一起

您可以让您的 python 脚本运行https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_INTERLEAVED_COLUMNS.html 中列出的查询来查找需要重新索引的表(也许您添加一些更适合您的情况的业务逻辑,例如:您自己的排序偏差阈值) REINDEX 应用最差类型的锁定,因此请尽可能在非工作时间定位脚本的运行 挑战交错排序的需求并支持复合

【讨论】:

我知道这已经有一段时间了,但我将其标记为正确,因为它让我重新审视了我的整个自动化维护过程。我最终发现连接重置是因为公司防火墙问题,然而,这个解释让我探索重建一些排序键及其类型。

以上是关于红移中的长真空的主要内容,如果未能解决你的问题,请参考以下文章

红移中的 juliandate 到 normaldate

红移中的 PERCENTILE_CONT()

如何计算红移中的MTD

红移中的 REGEXP_REPLACE

红移中的正则表达式

红移中的正则表达式