我的表上有 100 多个索引。我想临时禁用所有索引,并希望在索引完成后重新启用它们。
键入每个索引名称来禁用它是不可行的。是否有任何 PostgreSQL 语句可以临时禁用所有索引,然后再次重新启用它们。
问候,
从评论中,您正在使用 select 进行批量导入。
PostgreSQL 有一个关于如何最好地最初填充数据库的指南,他们建议使用COPY命令批量加载行。该指南还提供了一些关于如何加快该过程的其他好技巧,例如在加载数据之前删除索引和外键(然后将其添加回来)。
如果要向现有表添加大量数据,删除索引、加载表,然后重新创建索引可能会更好。当然,在索引丢失期间,其他用户的数据库性能可能会受到影响。在删除唯一索引之前还应该三思而后行,因为当索引丢失时,唯一约束提供的错误检查将会丢失。
您可以检查系统目录以禁用索引:
update pg_index set indisvalid = false where indexrelid = 'test_pkey'::regclass
Run Code Online (Sandbox Code Playgroud)
这意味着索引不会用于查询,但仍会更新。它是用于并发索引构建的标志之一。如果您设置indisready为false,这将禁用更新。
如果您想禁用单个查询的所有内容
BEGIN;
DROP INDEX foo_ndx;
EXPALIN ANALYSE SELECT * FROM foo;
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)
您可以在事务中执行此操作,以使恢复变得非常简单。您还可以禁用indexscan以禁用所有索引。另外,请确保您正在执行EXPALIN ANALYSE查询。
| 归档时间: |
|
| 查看次数: |
20569 次 |
| 最近记录: |