Esta pergunta está relacionada ao armazenamento PostgreSQL TOAST e à pergunta GIS.SE: A compactação TOAST deve ser desativada para PostGIS?
Basicamente, eu queria saber se existe alguma garantia de complexidade de tempo constante (O(1)) para o acesso aleatório dos elementos do array?
Ou seja, para obter arr[n]
, o número de etapas do pior caso é necessário uma constante (ou seja, O(1)
) ou outra coisa ( O(log n)
etc.)?
Estou perguntando porque em certos formulários de dados, como linhas PostGIS ou rasters, os dados principais são logicamente uma matriz (de coordenadas). Sabe-se que o tempo de acesso a esses dados pode ser extremamente longo, uma vez que a quantidade de dados ultrapassa um determinado limite (como 500 pontos). Uma possível razão é que os dados de tais tamanhos são transferidos para o armazenamento TOAST e potencialmente os dados podem ser compactados (por exemplo, com o main
armazenamento). Não está claro como o PostgreSQL pode prever a localização aproximada de um elemento e ainda oferecer tempo de acesso aleatório.
O tempo de acesso para arrays na maioria das linguagens de programação é constante ( O(1)
). E esse é o ponto de usar uma matriz. Só por curiosidade:
Os arrays do PostgreSQL têm tempos de acesso constantes? (quando e quando não?)
Depende do tipo de dados dos elementos da matriz.
Se for um tipo de dados de largura fixa como
integer
ouuuid
, o deslocamento na matriz pode ser calculado com uma multiplicação simples e a complexidade é O(1).Para tipos de dados de largura variável como
text
,varchar
,char
oujsonb
, cada elemento do array tem comprimento diferente, e acessar o n-ésimo elemento em um array significa pular os primeiros n-1 elementos, então a completude é O(n).Veja a função
src/backend/utils/adt/arrayfuncs.c
na fonte.Você pode saber se um tipo de dados tem comprimento fixo observando a
typlen
coluna empg_type
. Se for -1, o tipo tem comprimento variável.Para o registro, desde o Postgres 13, os principais bytes de valores TOAST podem ser acessados devido a essa melhoria. Citando as notas de lançamento do Postgres 13 :
Este é o recurso em questão:
https://commitfest.postgresql.org/23/2135/
Mas parece que não pode ser aplicado ao acesso ao array (ainda). Veja o comentário de Laurenz.