@@ -211,67 +211,9 @@ postgres=#\COPY (SELECT count(*) FROM customer) TO '/path/to/file/on/server' WIT
```
## Tunning
Por padrão o postgres vem com uma configuração básica para funcionar com a maioria dos sistemas, o que não é ideal para produção.
Caso seja necessário, é possivel alterar parâmetros e padrões de comportamento que resultem em sua otimização.
Para isso é possível alterar as configurações no arquivo `postgresql.conf` que pode ser localizado com `SHOW config_file`. Dependendo do parâmetro alterado pode-se atualizar o serviço sem a necessidade de reiniciar com o comando `SELECT pg_reload_conf()`.
#### max_connections
Configura o número máximo de conexões concorrentes que o servidor suporta.
Configura a quantidade máxima de memória compartilhada que o servidor postgres utiliza. O aumento de shared_buffers também requer o aumento de max_wal_size.
- Recomendação: Configurar valor com 25% da memória disponível, pois para os outros 75% será utilizado para tarefas como cacheamento e conexões.
#### effective_cache_size
Retorna ao planer de consulta do postgres a quantidade de memória disponível para cacheamento tanto em shared_buffers quanto no filesystem. É utilizado para fazer estimativas, não faz alocações efetivamente.
- Recomendação: Configurar entre 50% e 75% da memória disponível.
#### work_mem
Configura a quantidade máxima de memoria que uma consulta pode usar em dados temporários como ORDER BY, Hash Joins, Hash Aggregate e Window Functions.
- Recomendação: Depende da complexidade das queries. Além disso work_mem multiplicado por max_connections resulta no uso máximo de memória transiente.
#### maintenance_work_mem
Configura a quantidade de memória disponível para operações de manutenção como VACUUM, criação de indices e etc.
#### wal_buffers
#### effective_io_concurrency
#### random_page_cost/seq_page_cost
#### log_min_duration_statement
Configura o tempo de execução mínimo para uma consulta ser registrada no log, util para debugging.
- Recomendação: Por default é desativado com -1. Entretanto é interessante para estudar consultas que consomem mais de 1000ms(1 segundo).
## Particionamento de Tabelas
Em situações em que tabelas não possuem altas taxas de atualização de tuplas, mas sim de inserções ou deleções é possível realizar o particionamento de tais tabelas para aumento de performance.
## Indexes
Realizando alterações nos métodos de acesso aos dados das tabelas com a criação de índices, embora possa reduzir a velocidade de escrita, pode aumentar a performance da árvore de consulta do postgres.
### Tipo\Casos de uso
#### B-Tree
B-Tree serve para ...
#### Hash
Hash serve para ...
#### Gist
Gist serve para ...
#### SP-Gist
SP-Gist serve para ...
#### Gin
Gin serve para ...
#### Brin
Brin serve para ...
### Indices em partição separada
Para fins de aumento de performance, é possível alterar o local em que o postgres armazena seus objetos como índices em uma partição separada. Entretanto esse método apenas funciona de forma relevante se a velocidade de leitura e escrita for maior que a do diretório onde o cluster está.
Uma solução mais interessante é cacheamento L2ARC com zfs de NVME ou SSD para todo o diretório do cluster.