Olá!

Vejam só isso.

Obs.: os detalhes seguem, pois podem ser úteis a algum colega iniciante.

Cenário:

Banco de dados de CEPs com mais de 633.401 registros cep_brasil.
tabela cep_full sem índice
tabela cep_full com índice

Criando o banco com codificação e a tabela cep_full:

postgres=# create database cep_brasil encoding 'win1252';

postgres=# \c cep_brasil

cep_brasil=# create table cep_full (
cep_brasil(# cep char(8),
cep_brasil(# tipo char(72),
cep_brasil(# logradouro char(70),
cep_brasil(# bairro char(72),
cep_brasil(# municipio char(60),
cep_brasil(# uf char(2)
cep_brasil(# );

Importanto do CSV (http://tudoemum.ribafs.net/includes/cep_brasil.sql.bz2)
cep_brasil=# \copy cep_full from E:\Enviar\cep_brasil_unique.csv

Essa é interessante para quem não conhece. Crio uma segunda tabela
tendo como base uma consulta sobre outra tabela, já importando todos
os registros:

cep_brasil=# create table cep_full_index as select * from cep_full;

Alterar a tabela cep_full_index adicionando índice:

cep_brasil=# alter table cep_full_index add constraint cep_pk primary key (cep);

Atualizando as estatísticas:

cep_brasil=# vacuum analyze;

Pegando o plano de consulta da primeira consulta:

cep_brasil=# explain select logradouro from cep_full where cep='60420440';
                         QUERY PLAN
-------------------------------------------------------------
 Seq Scan on cep_full  (cost=0.00..33254.51 rows=1 width=71)
   Filter: (cep = '60420440'::bpchar)
(2 rows)

O plano da segunda:

cep_brasil=# explain select logradouro from cep_full_index where cep='60420440';
                                  QUERY PLAN
------------------------------------------------------------------------------
 Index Scan using cep_pk on cep_full_index  (cost=0.00..8.37 rows=1 width=71)
   Index Cond: (cep = '60420440'::bpchar)
(2 rows)

Isso foi interessante, pois numa tabela grande gasta um tempo
irrizório. Como eu estava fazendo, usando o \timing, a consulta
demorava muito.

Agora vejam só quanto ao cache, realizando as consultas de fato:

cep_brasil=# \timing
Timing is on.
cep_brasil=# select count(cep) from cep_full_index;
 count
--------
 633401
(1 row)

Time: 499,263 ms
cep_brasil=# select count(cep) from cep_full;
 count
--------
 633401
(1 row)

A tabela sem índice gasta menos tempo que a com índice.

Valeu Roberto.

-- 
Ribamar FS - [EMAIL PROTECTED]
http://ribafs.net
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a