是否有性能原因(或其他原因)更喜欢idx
(来自intarray)在array_position
整数列表中查找整数的位置?
我问是因为我们之前使用idx
过array_position
的被添加到 Postgres 中。如果没有性能损失,最好使用内置函数而不是依赖 intarray 扩展。
非常非正式的基准测试表明它具有可比性。PostgreSQL 版本是 13.5。
是否有性能原因(或其他原因)更喜欢idx
(来自intarray)在array_position
整数列表中查找整数的位置?
我问是因为我们之前使用idx
过array_position
的被添加到 Postgres 中。如果没有性能损失,最好使用内置函数而不是依赖 intarray 扩展。
非常非正式的基准测试表明它具有可比性。PostgreSQL 版本是 13.5。
有多个或多或少的细微差别。通过查看手册中的描述,一些变得显而易见:
手册关于
idx()
:手册关于
array_position()
:如果未找到,则
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 - 演示所有。