2014-09-21 61 views
5

我寫了一個簡單的腳本來每週重新編制我們的PG數據庫一次。它有一個簡單的邏輯:如何在純SQL中獲取現有索引的完整CREATE INDEX子句?

  • 通過臃腫的字節量
  • 查找創建從散列映射可變折射率子句得到頂部10索引(索引名 - >創建子句)
    • 如果沒有,則 - 登錄到標準錯誤,並轉到下一個索引
  • 創建新的索引同時
  • 降舊索引同時
  • 重命名新index

作爲一個適當的懶惰開發人員,我不喜歡這個概念,我必須不斷更新我的散列表。 (另一方面,我發現有兩個效率低下的指數,而這樣做。)

pg_index似乎很有用的信息,有沒有辦法從它重建一個創建索引子句?

很容易得到列列表,但我們使用不同的索引類型,不同的opclasses字段,部分索引...誰知道什麼。 重要的是要確保我們將得到與首先用於創建索引的相同子句。

回答

9

是的,有一個內置的功能pg_get_indexdef爲此目的。

例如爲:

regress=> SELECT pg_get_indexdef('demo_pkey'::regclass); 
        pg_get_indexdef      
-------------------------------------------------------- 
CREATE UNIQUE INDEX demo_pkey ON demo USING btree (id) 
(1 row) 
+0

這真是一個恥辱,沒有一個表的定義等效功能('pg_get_tabledef()'真的會很有用) – 2014-09-21 12:21:18

+0

@a_horse_with_no_name是的,我同意。非常強烈。我通過將'pg_dump'作爲客戶端工具理解邏輯(降級),但缺少服務器端DDL導出作爲選項非常令人沮喪。 – 2014-09-21 12:22:36

+0

哇!很高興它真的存在。即使知道這個函數的描述,我也不能輕易地谷歌它:) – skaurus 2014-09-21 12:23:17

相關問題