Pessoal,

Tenho várias consultas como exemplo abaixo, e vou precisar executar em
bases com 100gb a 500gb do postgreSQL, brevemente.

------------------------------------------------------------------------
select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty,
    sum(l_extendedprice) as sum_base_price,
    sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
    sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
    avg(l_quantity) as avg_qty,
    avg(l_extendedprice) as avg_price,
    avg(l_discount) as avg_disc,
    count(*) as count_order
from     lineitem
where
    l_shipdate <= date '2005-12-01' - interval '117' day
group by
    l_returnflag,
    l_linestatus
order by
    l_returnflag,
    l_linestatus;
--------------------------------------------------------------------------
Vários autores (cito 3 exemplos abaixo) falam que uma coluna boa
candidata a índice deve:
- aparecer na clausula WHERE.
- aparecer em clausulas de GROUP BY ou ORDER BY
- etc...

Mas pergunto, e as colunas que aparecem ANTES do WHERE, ou seja no
SELECT como as colunas com funções  SUM, AVG e COUNT, como acima.
Pelo que entendi, um índice ajuda a encontar as linhas da tabela mais
rapidas, e com as linhas encontradas, nao precisaria de um indice para
fazer SUM, AVG, ou COUNT, seria isso a justificativa para os autores
não sugerirem criar índices para essas colunas com SUM, AVG e COUNT ?
e no caso de muitos dados para fazer o SUM, etc?

Mas então porque para o Group By e Order by é sugerido a criação de
índices, pois na verdade eles fazer de forma similar o que faz o SUM,
AVG e COUNT, ou seja eles somente manipulam (ordenação/agrupamento) os
dados e não ajudam a encontrar os mesmo no discos.

Na ref. 3 tem a seguinte afirmação: " Não indexe colunas que aparecem
em Cláusulas WHERE com funções ou operadores.
Uma cláusula WHERE que usa uma função, diferente de MIN ou MAX ou um
operador com uma chave indexada, não é disponibilizado o caminho de
acesso utilizando o índice, exceto com índices baseados em função."

No entanto ele não fala nada de funcoes ANTES do WHERE. A minha
questão é compensa criar índices para colunas, se baseando nas colunas
que aparecem apos o SELECT?

Obs. Eu sei que criar índices demasiadamente causa gargalos em
atualizações, mas meu ambiente, é mais orientado a consultas com
poucas atualizações.

1- http://www.cs.toronto.edu/~alan/papers/icde00.pdf (pag 1)
2- Silberchatz, K et. al. Sistemas de banco de dados, Campus, 2006.
3- https://docs.oracle.com/cd/E18283_01/server.112/e16638.pdf (Pag. 371)
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a