2010-02-15 50 views
1

(Postgres的8.3)Postgres的:其中有許多縮小觸發範圍

我與一個數據庫表X 100+列寬的工作(我不能悲傷地改變)得到不斷和更新非常頻繁正常的業務流程。

我有一個要求,基於更新的不尋常的業務流程更新的特定列X更新表ÿ。然而,由於針對X的更新數量非常高,因此僅應用檢查X.foo的觸發器來決定是否更新Y被認爲是不可接受的。

也不是線的末端,或者有一個祖先的幾個深的鏈,所有這些都需要泡到根。

我能想到的唯一的解決方案是:

  • 打破X到多個表(不準)
  • 明確作出更新Ÿ(和ž等)作爲更新X的業務邏輯的一部分,但是這將佔有很大的空間,並且當有人在另一個流程中實施相同操作時,會留下很大空間讓某人錯誤或錯過了它。這顯然只是不好的設計(我試圖逐漸解決我可以)。

有誰知道一種方法來限制列或任何其他選擇的觸發器執行?觸發視圖?其他巫毒?

回答

2

你也許可以用規則做一些事情,但之前已經說過,觸發器應該是「足夠好」的。但是,如果您試圖解決管理問題而不是技術問題,規則可能會對您有所幫助。他們將在執行期間提前申請。小心他們通常在序列等方面存在的一些缺陷。

+0

最後還是遵守規則,但仍未達到基準,但因爲現在已有足夠的替代解決方案,所以確實存在管理問題。未來的觀衆尋找答案:希望你有PG9! – annakata 2010-02-25 20:48:20

0

爲什麼標準觸發器是不可接受的?運行一個函數,首先檢查是否NEW.column_name=OLD.column_name,如果它是相同的,則返回便宜。你可以在一秒鐘內發射數十萬個。您的系統可能無法處理每秒數百次以上的交易,數量減少3個數量級。

有條件的,9.0中的延遲觸發器會更快,但比普通觸發器快大約2倍。請參閱Depesz的博客中的a relevant post。您可以在Postgres 9 development version中運行一些基準測試。

+0

感謝您的博客鏈接。我強烈懷疑這是無意識優化的情況,但我仍然需要這樣做。觸發器被認爲比我更權威的人不配。 :/(如果我們每秒鐘看幾千個更新)。 – annakata 2010-02-15 14:30:02

+0

也許如果你用一種「特殊的新技術,使用專門針對這種情況進行優化的特殊觸發器」來構建一個基準。使用類似「begin;如果OLD.colname = NEW.colname」的觸發器,然後返回NEW;選擇「expensive_function(); end;」和一些非常聰明的聲音(和默認;-))修飾符,如「VOLATILE STRICT SECURITY INVOKER」。 – Tometzky 2010-02-15 16:01:41