2021年9月10日 星期五

Postgresql 實作四捨六入函數、SQL vs PL/pgsql 效能比較

一般而言在大部分資料庫在 ROUND 函數是採用四捨五入進位,但有部分資料庫例如 Teradata 是採用四捨六入五成雙,兩種不同算法的小數點的誤差在大量數據進行運算時可能會被放大成好幾位數的誤差,下面參考了一些資料在 Postgres 中實作四捨六入函數。


一開始是使用 PL/pgsql 的 if .. else.. 判斷進行實作,但是執行上發現自建函數的方式與原生C語言函數效能差異過大,約十倍左右,而在大量運算下執行時間會比使用原生 ROUND 函數慢很多,後來在測試階段發現,同樣的語法使用 SQL FUNCTION 進行實作會比 PL/pgsql 快很多,從參考資料裡面了解到應該是因為使用 PL/pgsql 會需要額外呼叫 PL/pgsql 的計算引擎造成額外開銷,因此在這類會被大量重複運用的函數在沒有複雜邏輯下會建議使用純 SQL 語法進行開發。