我正试着在redshift中为一些大表运行VACUUM REINDEX
。当我在sqlworkbenchj中运行其中一个真空时,它永远不会结束,并在大约2小时后返回peer重置的连接。在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运行这些查询?我希望他们每人至少能坚持一个小时。这是预期的行为吗?
最佳答案
简短的回答
您可能需要在Python脚本中添加一个机制,以便在重命名失败时重试,基于https://docs.aws.amazon.com/redshift/latest/dg/r_VACUUM_command.html
如果真空重新索引操作在完成之前终止,则下一个真空将在执行完全真空操作之前恢复重新索引操作。
然而。。。
有几点需要注意(如果你已经知道的话,我很抱歉)
redshift中的表可以有n个排序键(数据排序依据的列),redshift只支持2种排序样式
你真的在整理
基于第一个排序列,然后基于第二个排序列,…
交错:表将按所有排序列(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/这里通常支持复合排序)
那么这是如何回答这个问题的呢?
如果您的表使用复合排序或完全不排序,则根本不需要真空重新索引,它不会带来任何价值
如果您的表使用交织,您将需要首先检查您是否甚至需要重新索引?.示例查询
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,那么肯定不需要重新索引
把这一切都集中起来
您可以让python脚本运行https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_INTERLEAVED_COLUMNS.html中列出的查询,以找到需要重新索引的表(也许您可以添加一些更适合您的情况的业务逻辑,例如:您自己的排序倾斜阈值)
reindex应用最坏类型的锁,因此如果可能的话,尝试将脚本的运行定位在关闭时间内
挑战交错排序的需要