2017-05-12 24 views
0

我們需要包含索引大小而不鎖定表。我嘗試使用「同時創建索引..」,但它導致在其中一個系統上創建INVALID索引。我們嘗試執行 - 刪除索引 - 同時刪除索引 - 重新索引表 但是間歇性地,他們也得到卡住。這使得通過腳本併發創建索引的整個方法很容易受到攻擊。PostgreSQL併發索引創建 - 無效索引

任何想法如何在沒有人工干預的情況下做到充分證明?如果不是的話,還有什麼其他有效的方法可以在大型表和繁忙表上以自動化方式在PostgreSQL中包含索引大小。

+0

無效索引通常是由於運行時取消了併發索引創建。索引創建是否成功完成? –

+0

「含有指數大小」是什麼意思?索引具有所需的大小,並且該大小不可配置。 「同時創建/刪除索引」仍然需要在表格上進行排他鎖定,但只需要很短的時間。沒有辦法避免這種情況,並且在一個可能會造成不良影響的繁忙服務器上。 –

+0

我的意思是減少隨時間增長的PG表的索引大小 - 可以使用reindex table/create - drop index完成,但這兩種都是侵入性技術 – user2350659

回答

0

爲了在腳本中同時構建索引,您需要在下一個命令中添加邏輯(因爲您無法進行事務處理)。只需檢查下一行中的索引是否無效,如果是,則中止腳本。

另外我會扭轉行動:首先你同時建立新的指數。如果成功,就放棄舊的。

https://www.postgresql.org/docs/current/static/sql-createindex.html

如果在掃描表,如死鎖或 唯一性衝突唯一索引出現問題,CREATE INDEX命令將 失敗,但留下一個「非法」索引。查詢目的此索引將被忽略 ,因爲它可能不完整;然而它會 仍然消耗更新開銷。

另一個區別是常規的CREATE INDEX命令可以是事務塊內執行 ,但CREATE INDEX CONCURRENTLY 不能。

+0

如何中止?我們檢查了什麼時候我們試圖同時刪除INDEX/DROP INDEX - 兩者都被間歇性地卡住了,並且reindex正在花費很多時間去除創建的INVALID索引。 – user2350659

+0

reindex會重建無效索引。如何中止什麼? –

+0

如何刪除無效索引,即使我們試圖刪除無效索引時,即使DROP INDEX也被卡住了。 – user2350659