Eu atualmente trabalhando com um maior wikipedia-dump derivada do banco de dados PostgreSQL; ele contém cerca de 40 GB de dados. O banco de dados está sendo executado em um servidor HP ProLiant ML370 G5 com Suse Linux Enterprise Server 10; Eu estou consultando-lo do meu laptop através de uma rede privada gerida por um simples roteador D-Link. Eu atribuído DHCP estático IPs (privados) para ambos laptop e servidor.
De qualquer forma, do meu laptop, usando pgAdmin III, I enviar alguns comandos SQL / consultas; alguns destes são CREATE INDEX, DROP INDEX, DELETE, SELECT, etc. Às vezes eu enviar um comando (como CREATE INDEX), ele retorna, dizendo-me que a consulta foi executada perfeitamente, etc. No entanto, o processo postmaster designado para tal comando parece permanecer dormindo no servidor. Agora, eu realmente não me importo isso, pois eu digo para mim mesmo que o PostgreSQL mantém um pool de postmasters prontos para processar consultas. No entanto, se este processo consome 6 GB de que 9,4 GB RAM atribuídos, eu me preocupo (e fá-lo para o momento). Agora, talvez este é um cache de dados que é mantida na memória [compartilhada] no caso de outra consulta acontece precisar usar os mesmos dados, mas eu não sei.
Outra coisa está me incomodando.
Eu tenho 2 tabelas. Um deles é a página de mesa; Eu tenho um índice em seu page_id coluna. A outra é a pagelinks tabelas que contém o pl_from coluna que referências nada ou uma variável no page.page_id coluna; ao contrário do page_id coluna, o pl_from não possui um índice (ainda). Para lhe dar uma ideia da dimensão das tabelas e da necessidade de me para encontrar uma solução viável, página tabela tem 13,4 milhões de linhas (depois eu apaguei aqueles que eu não preciso) enquanto o pagelinks tabela tem 293 milhões.
Eu preciso executar o seguinte comando para limpar o pagelinks mesa de algumas de suas linhas inúteis:
DELETE FROM pagelinks USING page WHERE pl_from NOT IN (page_id);
Então, basicamente, eu desejo para livrar o pagelinks tabela de todas as ligações provenientes de uma página não na página mesa. Mesmo depois de desativar os loops aninhados e / ou varreduras seqüenciais, o otimizador de consulta sempre me dá a solução seguinte:
Nested Loop (cost=494640.60..112115531252189.59 rows=3953377028232000 width=6)
Join Filter: (outer.pl_from <> inner.page_id)
-> Seq Scan on pagelinks (cost=0.00..5889791.00 rows=293392800 width=17)
-> Materialize (cost=494640.60..708341.51 rows=13474691 width=11)
-> Seq Scan on page (cost=0.00..402211.91 rows=13474691 width=11)
Parece que tal tarefa levaria mais de semanas para ser concluído; Obviamente, isso é inaceitável. Parece-me que eu seria muito melhor que usar o page_id índice para fazer a sua coisa ... mas é um otimizador de teimoso e eu poderia estar errado.













