Existem razões de desempenho (ou outras razões) para preferir idx
(de intarray ) array_position
encontrar a posição de um inteiro em uma lista de inteiros?
Pergunto porque usamos idx
desde antes array_position
foi adicionado ao Postgres. Seria bom usar a função interna em vez de depender da extensão intarray, se não houver perda de desempenho.
Um benchmarking muito informal sugere que é comparável. A versão do PostgreSQL é 13.5.
Existem várias diferenças mais ou menos sutis. Alguns ficam óbvios ao olhar para a descrição no manual:
O manual sobre
idx()
:O manual sobre
array_position()
:Se não encontrado ,
idx()
retorna 0, masarray_position()
retornanull
.idx()
não consegue lidarnull
de jeito nenhum.intarray
como um todo não permite arrays comnull
valores. Então também não faz sentido procurar por ele, você sempre conseguenull
quando procura pornull
.array_position()
permitenull
.Ao contrário
idx()
de ,array_position()
permite um deslocamento na busca como 3º parâmetro. Assim, você pode percorrer arrays para encontrar uma correspondência após a outra.idx()
nunca pode encontrar elementos após a primeira ocorrência. (intarray
é principalmente otimizado para lidar com elementos de matriz únicos e classificados.)OTOH,
idx()
aceita arrays multidimensionais (trata-os como planos), enquantoarray_position()
não.Subscritos de matriz não padrão são ignorados por
idx()
(geralmente ignorando dimensões e subscritos de matriz), mas honrados porarray_position()
. Portanto , os resultados podem diferir para expressões simples e aparentemente equivalentes! É melhor ficar com os subscritos de matriz padrão, mas é preciso estar ciente das possibilidades. Ver:array_position()
recebe argumentos polimórficos, portanto, funciona para qualquer tipo de array , enquantoidx()
funcionainteger
exclusivamente. Há prós e contras para qualquer um.idx()
é mais rápido com a resolução do tipo de função e nunca será confundido com tipos diferentes, mas é limitado ainteger
:integer
ou morrer.Toda a versatilidade adicionada
array_position()
tem um preço. Mais importante ainda,array_position()
usaIS NOT DISTINCT FROM
semântica para lidar comnull
valores, e isso é substancialmente mais caro. Isso leva à diferença possivelmente mais importante:idx()
é muito mais rápido e escala muito melhor com matrizes longas.(Seu "benchmarking muito informal" o enganou de alguma forma.)
db<>fiddle aqui - demonstrando tudo.