sql - 邮递员。're-index' 使用 drop 和 create
问题描述
我们有一个相当大且使用量很大的数据库,其中的索引确实需要一些清理。我想使用的是 Reindex 功能,但这是不可能的,因为不支持“并发”并且我们不能使用锁。
所以我想出的是找到所有索引,并为每个索引创建一个新的 temp_index (同时不会有锁)。然后删除旧索引并将 temp_index 重命名为 index。
现在我遇到了另一个问题,在尝试删除旧索引时,postgres 抱怨约束,我不知道如何解决这个问题。这些约束当然需要存在并更新或连接到新索引。这就是我碰壁的地方,我不知道如何解决这个问题。任何帮助将非常感激。
解决方案
这是一个如何做到这一点的示例:
CREATE TABLE tab (id integer CONSTRAINT tab_pkey PRIMARY KEY);
现在让我们“ REINDEX CONCURRENTLY
”:
CREATE UNIQUE INDEX CONCURRENTLY tab_pkey_temp ON tab (id);
BEGIN;
ALTER TABLE tab DROP CONSTRAINT tab_pkey;
ALTER INDEX tab_pkey_temp RENAME TO tab_pkey;
ALTER TABLE tab ADD CONSTRAINT tab_pkey PRIMARY KEY USING INDEX tab_pkey;
COMMIT;
推荐阅读
- php - 无法让 WP Customizer Color Picker 在我的网站上实际更改颜色
- sql-server - EF4:第一次 SaveChanges 到远程服务器大约需要 15 分钟
- jquery - 在 JQuery 中未触发模态表单
- javascript - 在 Python 的 Bokeh 中使用 Javascript 回调过滤数据
- android - 使用 firebase 按最新消息对聊天列表进行排序
- php - Symfony - 在没有方法执行的情况下检查某些东西
- c++ - 使用字符串流复制 %f、%g 和 %e 的行为
- python - Python 没有采用 UTF-8 编码
- python - 如何在 python 中为深度学习选择合适的图像形状
- amazon-web-services - Amazon EBS 磁盘空间如何跨实例共享?