Em 4 de agosto de 2014 09:26, Flavio Henrique Araque Gurgel < [email protected]> escreveu:
> Não, o PostgreSQL não aceita hints e nunca aceitará. É um erro achar >> que hints são uma solução para esse tipo de problemas, normalmente >> eles causam mais problemas do que resolvem. Nem sempre usar um >> índice é o melhor caminho para uma consulta e isso varia com o >> volume das tabelas envolvidas. >> > Flavio, >> Discordo sobre Hints, pois imagine a situação abaixo: >> // >> >> >> torce_para count(*) >> -------------- ---------- >> São Paulo 4.000.000 >> >> Corinthians 8.000.000 >> Palmeiras 6.000.000 >> Santos 2.000.000 >> VOCEM de Assis 8 >> >> Se existe um índice em torce_para e uma query pedir todos os torcedores >> do VOCEM de Assis, é muito provável que o PostgreSQL fará "Sequencial >> Scan" (full table scan - Oracle). É muito mais barato para o Otimizador >> fazer um Sequencial Scan que um acesso a milhões de linhas do índice. >> > > Ou o planejador do Oracle é uma bosta (e por isso precisa de hint mesmo > pra funcionar) ou você se enganou, colega. Eu espero que você tenha > realmente se enganado. > Flavio, acho que voce não entendeu o que falei sobre usar o Índice, não vou entrar no mérito do HINT pois cada um tem sua preferencia, vamos ao fatos do cenário somente, vou explicar abaixo ---> > Veja meu exemplo, fiz agora aqui em cinco minutinhos e reproduzi seu > cenário: > > psql (9.3.4) > Digite "help" para ajuda. > > flavio=# create table torcedores (torce_para text); > CREATE TABLE > flavio=# insert into torcedores (torce_para) select 'São Paulo' from > (select generate_series (1, 4000000)) a; > INSERT 0 4000000 > flavio=# insert into torcedores (torce_para) select 'Corinthians' from > (select generate_series (1, 8000000)) a; > INSERT 0 8000000 > flavio=# insert into torcedores (torce_para) select 'Palmeiras' from > (select generate_series (1, 6000000)) a; > INSERT 0 6000000 > flavio=# insert into torcedores (torce_para) select 'Santos' from (select > generate_series (1, 2000000)) a; > INSERT 0 2000000 > flavio=# insert into torcedores (torce_para) select 'VOCEM de Assis' from > (select generate_series (1, 8)) a; > INSERT 0 8 > flavio=# create index torce_para_idx on torcedores (torce_para); > CREATE INDEX > > Agora o que interessa: > > flavio=# SELECT torce_para, count(torce_para) FROM torcedores GROUP BY > torce_para; > torce_para | count > ----------------+--------- > Corinthians | 8000000 > Palmeiras | 6000000 > Santos | 2000000 > São Paulo | 4000000 > VOCEM de Assis | 8 > (5 registros) > > flavio=# EXPLAIN ANALYZE SELECT * FROM torcedores WHERE torce_para = > 'VOCEM de Assis'; > QUERY PLAN > > > ------------------------------------------------------------ > --------------------------------------------------------------------- > > Index Only Scan using torce_para_idx on torcedores (cost=0.56..8.58 > rows=1 width=10) (actual time=0.341..0.343 rows=8 loops=1) > > Index Cond: (torce_para = 'VOCEM de Assis'::text) > > > Heap Fetches: 8 > > > Total runtime: 0.361 ms > > > (4 registros) > > Logo, sua afirmativa é *errada* e o planejador do PostgreSQL entendeu > direitinho que o índice é bastante útil ali. Vamos tentar para um dos > outros times: > Ok, O PostgreSQL resolveu corretamente, de forma diferente da que eu falei, pois usou o índice corretamente. Mas na verdade fazendo o ANALYSE voce gerou um HISTOGRAMA, e no histograma tem a informação que o time "VOCEM_de_assis" não é uma das colunas mais frequentes, conforme outro colega postou. Mas veja que eu mencionei que o SGBD "provavelmente" não utilizaria o índice, mas é que não considerei que seria utilizado um HISTOGRAMA, se soubesse disso não iria fazer esta " AFIRMAÇÃO", se voce não considerar o uso de HISTOGRAMA, provavelmente aconteceria o que mencionei. Na verdade esse cenário que você montou, não foi exatamente o que falei, pois com um Histograma o OTIMIZADOR ja vai ter outra ação ao planejar a query, diferente se fosse sem um histograma presente. Espero ter esclarecido agora minha "afirmação". []s Wiliam
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
