0

我有一個非常長的運行功能,這是一個導入過程,它目前正在運行。它已經運行了10個小時,根據我的計算 - 大約需要16-24小時才能完成。Force Postgres索引創建

但是,它花費這麼長時間的原因之一是因爲它用於查找(以及寫入)的表格之一未正確索引。

我不能中斷函數,因爲這會導致它回滾事務並撤銷其最近10個小時的工作。但是,我不能在中間操作時創建索引,因爲它保留了表上的鎖定。

有什麼辦法可以強制Postgres獲得對錶的明確鎖定並創建索引(在創建它時暫停函數執行)?

如果沒有,是否有反正我可以中斷功能沒有讓它回滾到目前爲止的工作?

回答

1

可以創建索引concurrently,索引創建時需要更長的時間來構建索引,但允許併發訪問表。

但是,這仍然不會幫助您,因爲運行語句不會突然更改其執行計劃「在飛行中」切換到使用索引的執行計劃。

而不是,一個聲明總是原子的。如果語句被取消,所有迄今完成的工作都會回滾。

至於我可以告訴你有兩個選擇:

  1. 等待進程結束
  2. 殺死進口並重新運行它,希望它能夠跑的比其餘10小時快一旦索引到位。
+0

非常感謝。第二種說法是我不太確定的;從技術上講,它是一個聲明,因爲它運行了一個'select func()',但是'func()'像存儲過程一樣構造並且在循環中運行一系列查詢。所以,它可能決定在循環迭代中使用新的索引。我會試試看!謝謝! – Ruslan

+0

此外,該函數正在爲其循環使用臨時表(CREATE LOCAL TEMP TABLE ... ON COMMIT DROP)。是否有一些hacky的方式,我可以截斷表中的其餘行? – Ruslan