Terei um enorme banco de dados PostgreSQL 9.3 com muitas tabelas com mais de 100M de entradas por tabela. Este banco de dados será basicamente somente leitura (uma vez que eu preencha todas as tabelas necessárias e construa os Ãndices, não haverá mais operações de gravação no banco de dados) e acesso de usuário único (executar e fazer benchmark de várias consultas do localhost), pois o banco de dados será usado apenas para fins de pesquisa. As consultas sempre usarão JOIN em campos de banco de dados inteiros.
Provavelmente comprarei um SSD (256-512 GB) para esse fim. Eu não usei um SSD para um banco de dados antes, então há algo que eu deveria ter medo? Posso colocar o banco de dados inteiro no SSD ou apenas os Ãndices? Existe algum conselho / tutorial especÃfico necessário para ajustar o PostgreSQL para SSDs? Observe que eu tenho uma boa estação de trabalho com um i7 e 32 Gb de RAM, então talvez você possa oferecer alguns conselhos também.
Sobre SSDs, o conselho principal é diminuir 'random_page_cost' para 1 (igual a 'seq_page_cost') no postgresql.conf, além de outras configurações usuais.
Não ter backups. Como qualquer dispositivo de armazenamento, ele pode morrer. Mantenha backups.
Se o carregamento de dados demorar muito, eu faria backup do banco de dados somente leitura depois de fazer o carregamento de dados, parando-o e copiando-o. Dessa forma, se algo der errado, seria mais fácil recriar mais tarde.
Se couber, armazene o banco de dados inteiro.
Se isso não acontecer, coloque um espaço de tabela no SSD e use-o para armazenar os Ãndices e quantas tabelas muito consultadas couberem.
A maioria dos benefÃcios dos SSDs são para cargas de gravação OLTP. A principal vantagem para cargas somente leitura é a busca rápida, e o slardiere cobriu isso.
Você pode querer definir
effective_io_concurrency = 5
ou algo para refletir o fato de que os SSDs podem fazer leituras aleatórias rápidas e com pipeline ... mas isso afeta apenas as varreduras de Ãndice de bitmap e, na prática,random_page_cost
já incorpora isso.Para uma carga somente leitura, não faz muita diferença.
Para o carregamento de dados inicial, consulte:
Defina um big
maintenance_work_mem
para a carga de dados. Eu usaria pelo menos8GB
.Defina um valor grande
work_mem
para o trabalho de consulta. O tamanho apropriado depende um pouco da complexidade da consulta. Comece500MB
e suba a partir daÃ.Aumente o seu
checkpoint_segments
(massivamente) para o carregamento de dados inicial.Lembre-se de desabilitar o overcommit da VM! (veja o manual do PostgreSQL: http://www.postgresql.org/docs/current/static/kernel-resources.html )