Có cách nào để hiển thị câu lệnh tạo cho một chỉ mục trong PostgreSQL


13

Tôi cần tạo lại một chỉ mục trong PostgreSQL đã bị chỉ số phình to. Vì tôi cần chỉ mục có thể sử dụng được trong khi nó được tạo, tôi không thể sử dụng REINDEX. Tôi sẽ tạo lại chỉ mục với một tên mới và sau đó bỏ tên cũ. Có cách nào để xem câu lệnh SQL đã được sử dụng để tạo một chỉ mục để tôi có thể sao chép nó không?



1
Hãy nhớ thêm CONCURRENTLYvào CREATE INDEXlệnh, vì vậy bạn không có một khóa độc quyền trên bàn.
Craig Ringer

Câu trả lời:


24

Thực tế, chỉ cần truy vấn pg_indexeskhung nhìn danh mục hệ thống như sau:

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

và bạn nên lấy lại câu lệnh SQL được sử dụng để định nghĩa nó.


4
Lưu ý rằng tên chỉ mục là duy nhất cho mỗi lược đồ . Bạn có thể muốn thêm AND schemaname = 'myschema'.
Erwin Brandstetter

0

Có, câu lệnh SQL đầy đủ để tạo lại chỉ mục có trong danh mục hệ thống. Cách đơn giản nhất tôi có thể nghĩ đến là sử dụng pg_dump / pg_restore:

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

4
Nếu cơ sở dữ liệu lớn, điều này có thể là quá mức cần thiết :) Bạn có thể muốn thêm -sđể loại trừ dữ liệu và, nếu biết, tên bảng với -t.
dezso

-1

Đơn giản hơn nếu bạn muốn tất cả (tất cả các chỉ mục) ...

=# SELECT indexdef FROM pg_indexes;

-1

indexdefvẫn không hoàn toàn giống như câu lệnh tạo trong trường hợp chỉ mục một phần. Ví dụ: nếu chúng ta tạo một chỉ mục với câu lệnh sau: CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');

postgres sẽ tạo ra indexdef sau: 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[]))

Mặc dù postgres indexdef có tất cả các loại được suy luận và có lẽ tốt hơn, ORM của chúng tôi đang so sánh mệnh đề where của hai chỉ mục và nghĩ rằng nó khác nhau khi chúng tôi tạo tập lệnh di chuyển. Đó là một vấn đề đối với chúng tôi.


Điều này không trả lời câu hỏi nào cả.
Laurenz Albe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.