Postgresql
是否使用 pg_restore 傳輸索引
我看到其他問題的答案是否定的(即索引不會隨標準轉移
pg_restore
)。但是,它看起來像是在我最近的轉儲/恢復中發生的,我不確定它是否真的轉移了。我將我的數據庫從 PostgreSQL 9.3 遷移到 9.4.5 並使用轉儲/恢復來執行此操作。
以下是使用的命令:
sudo -u postgres pg_dump -h localhost -p 5432 -d nominatim -F d -f dump/postgres/backup -j 20 sudo -u postgres pg_restore --create --dbname=nominatim --exit-on-error -h localhost -p 5432 -F d -j 7 dump/postgres/backup
轉儲和還原成功(沒有錯誤)。
我在執行還原時將 autovacuum 設置為關閉,因此我
analyze
在 psql 中執行(無參數)並連接到已還原的數據庫。我注意到的第一件事是,在 9.3 下,數據目錄佔用了大約 860GB,而在 9.4 下,它佔用了大約 680GB。9.4 效率更高嗎?
我注意到的第二件事是我看到了數據庫中的索引:
nominatim=# \d country_name Table "public.country_name" Column | Type | Modifiers -------------------------------+--------------------------------- country_code | character varying(2) | name | hstore | country_default_language_code | character varying(2) | partition | integer | Indexes: "idx_country_name_country_code" btree (country_code) nominatim=# \d idx_country_name_country_code Index "public.idx_country_name_country_code" Column | Type | Definition --------------+----------------------+-------------- country_code | character varying(2) | country_code btree, for table "public.country_name" nominatim=# select * from pg_indexes where tablename = 'country_name'; schemaname | tablename | indexname | tablespace | indexdef ------------+--------------+-------------------------------+------------+--------------------------------------------------------------------------------------- public | country_name | idx_country_name_country_code | | CREATE INDEX idx_country_name_country_code ON country_name USING btree (country_code) (1 row)
我是否仍然需要重新編制索引,或者我的索引是否以某種方式或其他方式完成了,或者我所看到的只是索引定義?任何關於更好地管理轉儲/恢復、檢查我的索引等的進一步提示肯定會受到讚賞。
是否使用 pg_restore 傳輸索引?
我看到其他問題的答案是否定的(即索引不會通過標準 pg_restore 轉移)
這似乎是一種誤解。索引本身(包含所有數據)不在轉儲中。只是重新創建它的命令。因此,索引被“轉移”了,但實際上,它們是在原始條件下重新創建的,沒有任何膨脹或死元組
我還需要重新索引嗎?
不會。還原後,您的所有索引都處於完美狀態。不需要
REINDEX
。但是,正如“恢復轉儲”一章的手冊中所建議的那樣ANALYZE
,這是有道理的:恢復備份後,明智的做法是
ANALYZE
在每個數據庫上執行,這樣查詢優化器就有有用的統計資訊;最後:
9.4 效率更高嗎?
不,一般不會。好吧,GIN 索引的大小已經大大減少了。但是您看到的很可能是從所有表和索引(包括系統表)中消除膨脹的效果。