Postgresql

是否有任何性能原因更喜歡 idx() (intarray) 而不是 array_position()?

  • March 28, 2022

是否有性能原因(或其他原因)更喜歡idx(來自intarray)在array_position整數列表中查找整數的位置?

我問是因為我們之前使用idxarray_position的被添加到 Postgres 中。如果沒有性能損失,最好使用內置函式而不是依賴 intarray 擴展。

非常非正式的基準測試表明它具有可比性。PostgreSQL 版本是 13.5。

有多個或多或少的細微差別。通過查看手冊中的描述,一些變得顯而易見:

手冊關於idx()

idx( integer[], ) →*item* integer``integer

返回與item匹配的第一個數組元素的索引,如果不匹配,則返回 0。

手冊關於array_position()

array_position( anycompatiblearray, anycompatible[, integer ] ) →integer

返回數組中第二個參數第一次出現的下標,或者NULL如果它不存在。如果給出第三個參數,則搜尋從該下標開始。數組必須是一維的。比較是使用IS NOT DISTINCT FROM 語義完成的,因此可以搜尋NULL.

  • 如果未找到,則idx()返回 0,但array_position()返回null
  • idx()根本無法處理**null**。intarray整體上不允許帶有null值的數組。所以搜尋它也沒有任何意義,搜尋null時總是會得到null.

array_position()允許null.

  • 與 不同idx()array_position()允許搜尋中的偏移量作為第三個參數。因此,您可以遍歷數組以找到一個接一個的匹配項。idx()永遠找不到第一次出現之後的元素。(intarray主要針對處理排序的、唯一的數組元素進行了優化。)

  • OTOH,idx()接受多維數組(將它們視為平面),但array_position()不接受。

  • 非標準數組下標被忽略idx()(通常繞過數組維度和下標),但被array_position(). 因此,對於看似等效的簡單表達式,**結果可能會有所不同!**最好堅持使用標準數組下標,但必須注意可能性。看:

  • array_position()接受多態參數,因此它適用於任何 數組類型,而僅idx()適用於integer。兩者都有優點和缺點。idx()函式類型解析更快,並且永遠不會與不同的類型混淆,但它僅限於integer:integer或死。

所有增加的多功能性array_position()都是有代價的。最重要的是,array_position()使用IS NOT DISTINCT FROM語義來處理null值,而且成本要高得多。這導致了可能最重要的區別:

  • idx()長陣列速度更快擴展性更好

(您的*“非常非正式的基準測試”*以某種方式誤導了您。)

db<>fiddle here - 展示所有。

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