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

Responder a