2014-08-29 19:10 GMT-03:00 Wiliam Balan <[email protected]>:
> Se as linhas de uma tabela no disco são classificadas em aproximadamente a
> mesma ordem que as chaves de índice, o banco de dados irá realizar um
> número mínimo de I/Os em cima da tabela para ler a tabela inteira através
> do índice. Do contrário,vai ser feito um número maior de I/Os em cima da
> tabela
>
>
Bem explicado. Só complementando, não é somente isso. Se considerarmos
ainda que a leitura da tabela cabe em cache, então o número de I/Os
necessários é o mesmo, independente do "cluster factor" (o termo não é
comum para o PostgreSQL, mas "entendível"). Agora, outro problema com esse
fator alto (tabela desorganizada) é que o número de operações aleatórias
(random I/O) é muito maior do que as sequenciais (seq I/O), e é sabido que
operações aleatórias nos discos são mais lentas que sequenciais (para SSD é
bem menos, mas creio que seq ainda seja um pouco -- só um pouco -- melhor
por causa do "pre-fetch"). E sim, o PostgreSQL utiliza de tal informação
para decidir entre o uso de um índice ou ou não (ou até uso do índice +
bitmap para diminuir o acesso aleatório).
> vejam esse exemplo:
>
> SQL> create table organized
> 2 as
> 3 select x.*
> 4 from (select * from stage
> order by object_name) x
> 5 /
> Table created.
>
> SQL> create table disorganized
> 2 as
> 3 select x.*
> 4 from (select * from stage
> order by dbms_random.random) x
> 5 /
> Table created.
>
>
Só para termos o exemplo em PostgreSQL e o pessoal poder entender/testar
neste:
CREATE TABLE stage AS /* uma tabela de exemplo */
SELECT i, md5(random()::text) AS object_name)
FROM generate_series(1, 1000000) i;
CREATE TABLE organized AS (SELECT * FROM stage ORDER BY object_name);
CREATE TABLE disorganized AS (SELECT * FROM stage ORDER BY random());
E creio que esteja considerando um índice em object_name:
CREATE INDEX ON organized (object_name);
CREATE INDEX ON disorganized (object_name);
> Nesse caso a tabela chamada DISORGANIZED vai ter um INDEX CLUSTERING
> FACTOR muito alto, pois os dados estao totalmente desordenados. Um bom
> clustering factor é igual ou próximo ao número de blocos de uma tabela. Um
> clustering factor ruim é é igual ou próximo ao número de linhas de uma
> tabela.
>
>
> No postgreSQL algum sabe se tem essa estatistica?
>
Sim. A estatística está presente no PostgreSQL, mas não é por índice, mas
sim para cada coluna da tabela (basta pegar as colunas do índice então).
Para conferir esse valor, basta consultar a coluna correlation da view
pg_stats:
SELECT tablename, correlation
FROM pg_stats
WHERE tablename IN ('organized', 'disorganized')
AND attname = 'object_name';
Essa coluna quando -1 indica totalmente ordenada em ordem decrescente, 1
totalmente ordenada em ordem crescente, e valores decimais entre -1 e 1 é o
fator (sendo negativo decrescente e positivo crescente). Detalhes sobre a
pg_stats em [1].
[1] http://www.postgresql.org/docs/current/static/view-pg-stats.html
Atenciosamente,
--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral