Por favor, estou com um problema em uma consulta do meu Banco de Dados e
preciso da ajuda de vocês.

- Ambiente:
PostgreSQL 9.3.6
S.O. Debian 3.2.63
Realizo replicação com Slony.

Estrutura do Banco:

CREATE TABLE cpf_resumo
(
  cpfid integer NOT NULL,
  cpf character varying(14),
  nome character varying(250),
  nascimento date,
  nome_mae character varying(250),
  cidade character varying(120),
  estado character varying(2),
  cep character varying(10),
  regiao_fiscal text,
  data_atualizacao timestamp without time zone,
  CONSTRAINT _cpf_resumo_new_pkey PRIMARY KEY (cpfid)
);


CREATE INDEX idx_cpf_resumo_nome_nascimento
  ON cpf_resumo
  USING btree
  (fnc_retira_preposicao(nome) COLLATE pg_catalog."default"
varchar_pattern_ops, nascimento);

CREATE INDEX idx_cpf_resumo_regiao_fiscal
  ON cpf_resumo
  USING btree
  (fnc_retira_preposicao(nome) COLLATE pg_catalog."default"
varchar_pattern_ops, regiao_fiscal COLLATE pg_catalog."default"
varchar_pattern_ops);

  CREATE INDEX idx_cpf_resumo_endereco
  ON cpf_resumo
  USING btree
  (fnc_retira_preposicao(nome) COLLATE pg_catalog."default"
varchar_pattern_ops, estado COLLATE pg_catalog."default"
varchar_pattern_ops, cidade COLLATE pg_catalog."default"
varchar_pattern_ops);

Quantidade de Tuplas na tabela:
185 Milhões

*Problema:*
- O planejador parou de utilizar o Index para realizar o SELECT, porém
apenas no Banco Master, no Slave realiza com Index, vejam o EXPLAIN:

Query:
EXPLAIN ANALYZE
SELECT
        regiao_fiscal, COUNT(*) AS Quantidade
FROM
        cpf_resumo
WHERE
         fnc_retira_preposicao(nome) LIKE fnc_retira_preposicao('JOSE
ROBERTO % SILVA%')
GROUP BY
        regiao_fiscal
ORDER BY
        regiao_fiscal;


*EXPLAIN MASTER:*
SELECT  regiao_fiscal, COUNT(*) AS Quantidade
  FROM cpf_resumo WHERE fnc_retira_preposicao(nome) LIKE
fnc_retira_preposicao('JOSE ROBERTO % SILVA%') GROUP BY regiao_fiscal ORDER
BY regiao_fiscal;

  Sort  (cost=107979.55..107979.55 rows=1 width=2) (actual
time=123115.588..123115.594 rows=10 loops=1)
  Sort Key: regiao_fiscal
  Sort Method: quicksort  Memory: 25kB
  ->  HashAggregate  (cost=107979.53..107979.54 rows=1 width=2) (actual
time=123115.557..123115.565 rows=10 loops=1)
        ->*  Bitmap Heap Scan *on cpf_resumo  (cost=1069.81..107886.60
rows=18585 width=2) (actual time=128.899..123089.087 rows=14805 loops=1)
              Filter: ((fnc_retira_preposicao(nome))::text ~~ 'JOSE ROBERTO
% SILVA%'::text)
              Rows Removed by Filter: 9438155
              ->  Bitmap Index Scan on idx_cpf_resumo_regiao_fiscal
 (cost=0.00..1065.16 rows=50209 width=0) (actual time=114.421..114.421
rows=189685 loops=1)
                    Index Cond: (((fnc_retira_preposicao(nome))::text ~>=~
'JOSE ROBERTO '::text) AND ((fnc_retira_preposicao(nome))::text ~<~ 'JOSE
ROBERTO!'::text))
Total runtime:* 123 115.676 ms*


EXPLAIN SLAVE:
SELECT  regiao_fiscal, COUNT(*) AS Quantidade
  FROM cpf_resumo WHERE fnc_retira_preposicao(nome) LIKE
fnc_retira_preposicao('JOSE ROBERTO % SILVA%') GROUP BY regiao_fiscal ORDER
BY regiao_fiscal;

  Sort  (cost=99.59..99.60 rows=1 width=2) (actual time=3538.941..3538.947
rows=10 loops=1)
  Sort Key: regiao_fiscal
  Sort Method: quicksort  Memory: 25kB
  ->  HashAggregate  (cost=99.57..99.58 rows=1 width=2) (actual
time=3538.909..3538.915 rows=10 loops=1)
        -> * Index Scan using idx_cpf_resumo_regiao_fiscal* on cpf_resumo
 (cost=1.07..5.34 rows=18846 width=2) (actual time=0.348..3509.038
rows=14805 loops=1)
              Index Cond: (((fnc_retira_preposicao(nome))::text ~>=~ 'JOSE
ROBERTO '::text) AND ((fnc_retira_preposicao(nome))::text ~<~ 'JOSE
ROBERTO!'::text))
              Filter: ((fnc_retira_preposicao(nome))::text ~~ 'JOSE ROBERTO
% SILVA%'::text)
              Rows Removed by Filter: 174880
Total runtime: *3 539.004 ms*


Pesquisando encontre [1] onde falam para utilizar o *random_page_cost = 1 *e
de fator quando utilizo este parâmetro o planejador passa a utilizar o
Index, igual ao Slave.


*Dúvidas*
- Por que o planejador parou de utilizar  o Index?

- Se eu colocar esse parâmetro na transação da aplicação, tenho algum
impacto negativo?


Obrigado por enquanto.



[1]
http://pglearner.blogspot.com.br/2015/01/learning-bitmap-index-scan-recheck-cond.html

-- 

*______________________________________**Renan Catalani Fuentes de Campos*

*Linkedin:  br.linkedin.com/in/renanfuentes/
<http://br.linkedin.com/in/renanfuentes/>*
*Skype:** renan_fuentes*

*Telefone: (19) 9 9717-9845*
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a