Bom dia pra todos.

Acompanhando as mensagens de perto, achei o assunto interessante e resolvi
brincar um pouco.
Mas antes, minha opinião:

Se só quero usar o SGBD para armazenar dados temporários com direito a
acesso muito rápido, talvez seja melhor usar outra abordagem que não
empregue o postgres.
Mas e se for o caso da aplicação a ser desenvolvida já faz uso do postgres?
Se já tenho o banco rodando, mas tenho uma tabelinha "sem vergonha" que uso
para armazenar algo descartável e que é mais importante um acesso rápido,
eu, de primeira,
pensaria em criar o tablespace temporário e engoliria o WAL, ou seja, vai ir
para o WAL mas tudo bem. OK? Bom fiz alguns testes e não foi muito legal o
resultado para esta abordagem.

Fui para a maquina virtual fazer alguns benchmarks bem por cima.

1º teste: instalação padrão.
2º teste: instalação com todo o cluster e binários em um fs temporário.
3º teste: instalação padrão com um tablespace temporário.

Comandos do pgbench utilizados

# inicializa as tabelas usadas pelo pgbench com um "scale factor" igual a 10
no banco de dados postgres
pgbench -i -s 10 postgres

# roda o proprio benchmark com 10 conexões simultaneas 1000 vezes para cada
uma destas.
pgbench -c 10 -t 1000 postgres


1º teste: Instalação padrão. Resultado:

 tps = 477.656061 (including connections establishing)
 tps = 478.578011 (excluding connections establishing)
-------------------

2º teste: Instalação com todo o cluster e binarios em um fs temporario:

montei um tmpfs seguindo o comando de um dos links fornecidos pelo Fabrízio.
Aumentei o tamanho do fs para conseguir rodar o pgbench:

$ sudo mount -t tmpfs -o size=500M,uid=tarcisio,gid=tarcisio,mode=0700 tmpfs
/home/tarcisio/tmpfs
configurei e instalei o postgres junto com o contrib tudo ai dentro.
Rodei o pgbench:

 tps = 823.146755 (including connections establishing)
 tps = 825.540711 (excluding connections establishing)

Quase o dobro. Porem, não vejo utilidade/praticidade em colocar o cluster
inteiro junto com os binários do postgres dentro de um fs temporário.
Se o que quero é algo bem simples e minha aplicação não utilizará o postgres
pra nada alem disso, prefiro estudar outras ferramentas.

-------------------

3º teste: Instalação padrão com um tablespace temporário.

Matei a instalação anterior. sudo umount /home/tarcisio/tmpfs
Montei de novo com tudo limpo e criei o tablespace:
=# CREATE TABLESPACE tmpfs OWNER tarcisio LOCATION '/home/tarcisio/tmpfs';

ALTEREI o código fonte do pgbench para criar as tabelas e indices dentro do
tablespace
Disso: create table tabela_aqui
Fiz isso: create table tabela_aqui TABLESPACE tmpfs
E disso: alter table pgbench_*** add primary key (bid)
Fiz isso: alter table pgbench_*** add primary key (bid) USING INDEX
TABLESPACE tmpfs
Compilei o pgbench de novo e rodei:

 tps = 453.644599 (including connections establishing)
 tps = 454.687999 (excluding connections establishing)

Foi pior que a instalação padrão! Ou seja, talvez não seja uma boa opção.
(ou benchmark mau feito)
Se já uso o postgres no cotidiano da minha aplicação, não tentaria "inventar
moda".
Criaria a tabela normalmente e ficaria agradecido pela velocidade que fosse.
(isso é uma meia-verdade)

O postgres não é lento para consultas em uma única tabela pequena como a que
pensaríamos em colocar na memória.
A coisa só começa a ficar feia com consultas complexas envolvendo joins e
cálculos. O que vale para outros SGBDS.



2009/9/24 Fabrízio de Royes Mello <fabriziome...@gmail.com>

>
>
> 2009/9/23 Euler Taveira de Oliveira <eu...@timbira.com>
>
>> Dois comentários: (i) se você preza pelos seus dados *não* faça isso a não
>> ser
>> que os mesmos sejam dados de sessão e (ii) mesmo que você crie uma
>> tablespace
>> e coloque a sua tabela lá, os dados vão precisar ser escritos no WAL então
>> _nem_ tudo vai ser escrito em memória.
>>
>>
> Com certeza, mas em se tratando de dados "voláteis" não teriamos problemas
> não é mesmo... e no caso do WAL o artigo que indiquei consta um comentário
> do Sr. Pavel Stehule que fala justamente sobre a escrita no WAL então seria
> interessante ter o cluster inteiro na ramfs para ter tudo em memória...
>
>
>
>> Quanto a dúvida do OP, o PostgreSQL *não* possui um equivalente ao
>> _engine_
>> memory. Apesar disso, se essa tabela é utilizada com certa frequência e
>> você
>> possui uma configuração adequada de _shared buffers_, com certeza, esta
>> tabela
>> estará na memória.
>>
>>
> No comentário ele também fala que o mais correto seria ajustar o valor do
> shared buffers... mas tendo um valor adequado nesse parâmetro mesmo assim
> teremos I/O do WAL certo? Então se a necessidade é escrever dados em memória
> em função do desempenho de I/O então o cluster inteiro na RAM seria
> inevitável... e pra manter isso somente com dados voláteis mesmo... (que
> baita *gambiarra* isso me parece)
>
>
> O amigo Everson poderia dar mais detalhes da sua real necessidade, porque
> daqui a pouco não é com o PostgreSQL que ele vai encontrar a solução. Há
> algum tempo li o artigo "Database Overkill" do Sr. Fábio Telles [1] que
> falava sobre vários SGBDs e creio que seja interessante dar uma olhada
> nessas informações.
>
> [1] 
> http://www.midstorm.org/~telles/2007/07/05/database-overkill/<http://www.midstorm.org/%7Etelles/2007/07/05/database-overkill/>
>
>
>
> --
> Fabrízio de Royes Mello
> >> Blog sobre TI: http://fabriziomello.blogspot.com
>
> _______________________________________________
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>


-- 
Tarcisio F. Sassara
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a