Postgresql

“不要使用錯誤進行流量控制”公理是否適用於 postgres?

  • October 10, 2021

在傳統程式中,有一條公理表明“不要使用錯誤來進行流控制”。一個普遍的例子是拋出一個錯誤然後擷取錯誤,而不是使用普通的條件語句或中斷語句。這是有害的,因為應用程序必須展開呼叫堆棧並呼叫一些相對昂貴的異常處理邏輯,而不是簡單地處理條件語句。

我正在使用一個 postgres 系統,其中使用者在 postgres 中呼叫一個函式,該函式在不滿足條件時拋出錯誤而不是不返回任何行。條件大致是“這個輸入值不存在,無事可做”而不是真正的例外情況。

當以類似於傳統程式的方式拋出錯誤時,postgres 是否會產生執行時成本?換句話說,在 postgres 中使用異常作為流控制對性能有害還是馬虎?

無法從我的腦海中說出發生異常時事件的確切順序。但我可以告訴你,它相對昂貴,除非需要,否則應避免使用。異常(錯誤)會導致周圍事務回滾,除非被擷取。

但是要擷取錯誤,您需要plpgsql 塊EXCEPTION中的子句(在函式過程或語句中)。並且在 plpgsql 函式塊中以一個子句開頭(即使沒有引發異常)是昂貴的,因為這樣的塊有效地形成了一個子事務(可能會被回滾),從而產生更多的成本。因此,手冊警告:DOEXCEPTION

包含EXCEPTION子句的塊的進入和退出比沒有子句的塊要昂貴得多。因此,不要在EXCEPTION沒有必要的情況下使用。

引用自:https://dba.stackexchange.com/questions/233391