Чи є спосіб показати оператор створення індексу в PostgreSQL


14

Мені потрібно відтворити індекс у PostgreSQL, який зазнав роздуття індексу. Оскільки мені потрібен індекс, щоб його можна було використовувати під час його створення, я не можу використовувати REINDEX. Я збираюся відтворити індекс з новою назвою, а потім скинути стару. Чи є спосіб побачити оператор SQL, який був використаний для створення індексу, щоб я міг просто скопіювати це?



1
Не забудьте додати CONCURRENTLYдо CREATE INDEXкоманди, щоб ви не брали ексклюзивний замок на столі.
Крейг Рінгер

Відповіді:


26

Насправді просто запитайте подання pg_indexesсистемного каталогу таким чином:

SELECT indexdef FROM pg_indexes WHERE indexname = '...'

і вам слід повернути оператор SQL, який використовується для його визначення.


4
Зауважте, що імена індексів є унікальними лише для схеми . Ви можете додати AND schemaname = 'myschema'.
Ервін Брандстеттер

0

Так, повний оператор SQL для відтворення індексу знаходиться в системному каталозі. Найпростіший спосіб, який я можу придумати, - це використовувати pg_dump / pg_restore:

$ pg_dump -F c | pg_restore -I <your_index_name>

4
Якщо база даних велика, це може бути надмірний вміст :) Ви можете додати, -sщоб виключити дані та, якщо вони відомі, ім'я таблиці -t.
дезсо


-1

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 порівнює два індекси, де застереження, і вважає, що це інше, коли ми створюємо сценарії міграції. Що для нас є проблемою.


Це зовсім не відповідає на питання.
Лоренц Альбе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.