Мне нужно пересоздать индекс в PostgreSQL, который пострадал от раздувания индекса. Поскольку мне нужен индекс, чтобы его можно было использовать во время его создания, я не могу использовать REINDEX. Я собираюсь воссоздать индекс с новым именем, а затем отбросить старое. Есть ли способ увидеть оператор SQL, который использовался для создания индекса, чтобы я мог просто скопировать его?
postgresql
index
Рори
источник
источник
CONCURRENTLY
вCREATE INDEX
команду, чтобы не брать эксклюзивную блокировку на столе.Ответы:
На самом деле, просто запросите представление
pg_indexes
системного каталога следующим образом:и вы должны вернуть оператор SQL, используемый для его определения.
источник
AND schemaname = 'myschema'
.Да, полный оператор SQL для воссоздания индекса находится в системном каталоге. Самым простым способом, который я могу придумать, является использование pg_dump / pg_restore:
источник
-s
чтобы исключить данные и, если известно, имя таблицы с помощью-t
.Проще говоря, если вы хотите их всех (все индексы) ...
источник
indexdef
по-прежнему не совсем совпадает с оператором создания в случае частичного индекса. Например, если мы создаем индекс со следующим оператором:CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');
Postgres сгенерирует следующий indexdef:
CREATE INDEX item_orgunit_idx ON public.items USING btree (orgunit_id) WHERE ((type)::text = ANY ((ARRAY['invoice'::character varying, 'purchaseorder'::character varying, 'beanpayment'::character varying])::text[]))
Хотя postgres indexdef имеет все выведенные типы и, вероятно, лучше, наш ORM сравнивает предложение двух индексов where и думает, что они разные, когда мы генерируем сценарии миграции. Что является проблемой для нас.
источник