Vamos supor que eu tenha o seguinte pg_trgm
índice na mydata JSONB
coluna:
CREATE TABLE mytable (mydata JSONB);
CREATE INDEX trgm_index_1 ON mytable
USING gin ((mydata#>>'{myfield}') gin_trgm_ops);
E vamos supor que vou inserir os seguintes dados em mytable
:
500k rows with mydata = { "myfield": "some_text" }
500k rows with mydata = { "another_field": "some_text" }
Portanto 1M
, linhas no total, mas metade delas contém valor que é usado na expressão de índice ( mydata#>>'{myfield}'
). Isso significa que o índice usará ~ 50% menos memória no disco do que usaria se todas as linhas contivessem myfield
o campo json?
Vamos simplesmente tentar!
Eu criei a tabela a partir da sua pergunta, então fiz o seguinte:
Até agora, temos apenas linhas onde
myfield
está presente. Vamos agora adicionar algumas outras linhas também:Depois disso, o tamanho do índice relatado foi alterado para 22 MB, o que significa que as novas linhas também são contabilizadas. Se você deseja excluí-los, deve criar um índice parcial:
O tamanho deste é inicialmente o mesmo (19 MB) do índice não parcial, mas depois de adicionar o segundo grupo de linhas, ele não muda :