Para conjuntos de dados muito grandes, você pode descobrir que uma SAN não é a ideal. As SANs se destacam em muitos e muitos pequenos ios muito rapidamente. Eles geralmente estão bem na taxa de transferência sequencial, a menos que você tenha uma interconexão muito rápida com eles e, mesmo assim, eles geralmente não são otimizados para taxa de transferência sequencial. Eu testei o desempenho de gravação de leitura sequencial e aleatório em minhas máquinas com Areca e LSI RAID Cards com cache com bateria, interface SAS nativa com RAID de software Linux e com uma SAN no back-end. O mais rápido para o acesso aleatório foi perto de um empate com a SAN e as placas RAID, mas para a taxa de transferência sequencial, o RAID de software do Linux os colocou no chão. Onde o HW RAID pode obter 350M / seo SAN estava na faixa de 100M / s (ele está conectado no gig e), o SAS nativo com SW RAID recebe cerca de 1G / s de leituras e cerca de 80% nas leituras. Tudo sequencial, claro. Não assuma que sua SAN é super rápida para o que você está fazendo, pode ser, pode não ser. Teste com bonnie ++ ou dd ou algo para ter uma ideia de quão rápido ele realmente é. Se você está ficando ~ 100MB / s sequencial, então será dolorosamente lento ao lado de uma máquina mais barata com 4 ou 8 unidades SATA de 7200RPM executando RAID-10 para análise.
Quando você diz 8x CPUs 3GHz, você quer dizer 8x sockets, cada um com 4 ou 8 núcleos? Ou 8 núcleos? Ou 4 núcleos com hyperthreading? para o seu tipo de trabalho, qualquer coisa além do total de 4 núcleos provavelmente será um desperdício. Qualquer coisa além dos 8 núcleos é definitivamente um desperdício. Com o OLAP / Analytics, você quer CPUs menos rápidas, se conseguir usá-las.
Ligado às suas configurações. shared_mem não precisa ser muito grande. No Windows, a implementação da memória compartilhada é sub ótima para valores grandes, e torná-la maior raramente ajuda a melhorar o desempenho. Dito isso, testaria vários valores para ver, mas algumas centenas de megas provavelmente seriam o mais rápido possível. trabalho de manutenção mem pode estar na faixa gig, mas o grande ganho é aumentar mais de 100M ou mais. work_mem é a metralhadora postgresql. Se você estiver indo para cima, e eu recomendo ir pelo menos 16 ou 32M em sua máquina, certifique-se de que você está limitando o parâmetro max_connections do postgresql para algumas dezenas de conexões no máximo. Se, de alguma forma, alguém iniciar várias consultas de uma só vez, você poderá ficar sem RAM rapidamente. Não é bom. OTOH, alguns testes provavelmente mostrarão que qualquer coisa acima de cem realmente não ajuda muito.
O perigo de colocar o work_mem em um nível muito alto é que ele acabará empurrando os dados armazenados em cache pelo sistema operacional para fora do cache, precisando apenas ser recarregados novamente. O custo de acessar os discos para obter esses dados geralmente é mais alto do que o ganho de realmente aumentar o volume.
Uma boa regra é manter work_mem * max_connections * 2 < 1/4 de memória. Então, em uma máquina com 64G de ram e 100 conexões, você gostaria de work_mem * 200 < 16G ou cerca de 80 Megs max. Isso garante que qualquer comportamento patológico em que todas as conexões sejam de vários tipos não matem a máquina muito rapidamente.
Se você achar que work_mem do 1G funciona muito melhor do que 100M etc, então você pode comprometer deixando o work_mem regular mais baixo para segurança e ter o único thread que executa grandes consultas definir sua própria work_mem na conexão.
Concordo com o cartaz anterior de que o windows é sub-ótimo para pgsql, com ênfase que é muito pior para o OLAP, onde a possibilidade de alocar mais shared_memory pode ser uma vantagem para o pg / linux.