是否有任何性能原因更喜歡 idx() (intarray) 而不是 array_position()?
是否有性能原因(或其他原因)更喜歡
idx
(來自intarray)在array_position
整數列表中查找整數的位置?我問是因為我們之前使用
idx
過array_position
的被添加到 Postgres 中。如果沒有性能損失,最好使用內置函式而不是依賴 intarray 擴展。非常非正式的基準測試表明它具有可比性。PostgreSQL 版本是 13.5。
有多個或多或少的細微差別。通過查看手冊中的描述,一些變得顯而易見:
idx
(integer[]
, ) →*item
*integer``integer
返回與item匹配的第一個數組元素的索引,如果不匹配,則返回 0。
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 - 展示所有。