我可以像这样一一重新索引索引:
database=# REINDEX INDEX CONCURRENTLY indexname1;
...
database=# REINDEX INDEX CONCURRENTLY indexname2;
...
如何在一个查询中运行多个索引的重新索引?
类似这样的:
database=# REINDEX INDEX CONCURRENTLY indexname1 indexname2;
ERROR: syntax error at or near "indexname2"
LINE 1: REINDEX INDEX CONCURRENTLY indexname1 indexname2;
^
或者这个:
database=# REINDEX INDEX CONCURRENTLY indexname_*
ERROR: syntax error at or near "*"
LINE 1: REINDEX INDEX CONCURRENTLY indexname_*
^
根据文档,当与分区表、模式或数据库一起使用时,REINDEX 无法在事务块内执行。这意味着您不能使用单个事务同时重新索引多个项目。
您可以通过带有 psycopg2 的 PostgreSQL 的 Python 接口,在单个脚本中同时执行多个 REINDEX 命令。
import psycopg2
index_list = ['indexname1', 'indexname2']
conn = psycopg2.connect(database="your_db_name", user="your_username", password="your_password", host="your_host", port="your_port")
cur = conn.cursor()
for index in index_list:
cur.execute(f"REINDEX INDEX CONCURRENTLY {index};")
conn.commit()
cur.close()
conn.close()
最终我找到了这个解决方案,尽管它肯定不适合所有情况:
由于我的最终目标是对数据库中的所有索引执行
REINDEX INDEX CONCURRENTLY indexname
,所有 REINDEX INDEX ...
的总和归结为运行单个 REINDEX DATABASE CONCURRENTLY dbname
查询。
警告: 仅当您了解数据库中有多少个索引、它们的大小是多少、此类
REINDEX DATABASE
可能需要多长时间才能完成以及它可能在服务器上创建多少额外负载时才使用此功能。