Bom dia, criei uma base de dados para testes de performance com uma
tabela contendo 2 milhões de registros contendo um campo text com texto
gerado aleatoriamente com 25 palavras cada.

A base de dados ficou com 2,5GB, estou utilizando shared_buffers de
3.5GB para que a base fique toda em cache.

Na verdade aqui há um engano.
Você dimensionou um shared_buffers onde *provavelmente* uma grande parte da tabela vai caber no cache do PostgreSQL.

O que todo mundo esquece é que, quando usamos muita memória para o PostgreSQL, não sobra nada pro cache do disco no Linux. Esse cache do disco é muito importante, pois ele costuma ser mais eficiente do que o cache do PostgreSQL, e o PostgreSQL aproveita bem isso.

Utilizando consultas para testes de performance percebo que sempre que
altero o texto a ser pesquisado a primeira consulta fica lenta, a
próximas ficam abaixo de 1 segundo. Exemplo de filtro:
to_tsquery('teste|porta|janela')

Você tem índices aí?
Você tem outras tabelas?
Enfim, seu teste me parece mais uma rota de colisão com uma parede do que um teste. É muito simples e não corresponde ao uso real de um banco de dados.

Minha dúvida é como a tabela é armazenada em cache, em partes?
porque se a tabela fosse toda para cache não justificaria a lentidão na
primeira consulta.

Quem vai pro cache do PostgreSQL são páginas, eventualmente uma tabela inteira, lembrando que há o cache do S.O. a considerar.

Obs.: já estou utilizando índice gin na coluna pré-processada do tipo
tsvector.

Índices também ocupam espaço do cache. Índices GIN costumam ser grandes.

[]s
Flavio Gurgel
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a