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

Responder a