红石的长真空

2024-05-23 18:37:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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来运行这些查询?我希望他们每个人至少能坚持一个小时。这是预期的行为吗?在


Tags: 方法redshiftdbstringconn事情engine重置
1条回答
网友
1楼 · 发布于 2024-05-23 18:37:02

简短回答

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

If a VACUUM REINDEX operation terminates before it completes, the next VACUUM resumes the reindex operation before performing the full vacuum operation.

但是

有几件事需要注意(如果你已经知道,我很抱歉)

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

  • 如果您的表使用复合排序或根本不排序,则根本不需要真空重新索引,它不会带来任何价值
  • 如果您的表使用的是交错的,则需要首先检查是否需要重新索引?。示例查询

    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
    
  • 如果“倾斜”的值为1.0,则肯定不需要重新编制索引

把一切都集中起来

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

相关问题 更多 >