2014-12-18 15:24 GMT-02:00 Flávio Alves Granato <[email protected]>:
>
> Pessoal,
>
> Estou com um problema,
>
>
> Tenho uma tabela message que tem indice nos campos created_date, status,
> origin, destination
>
> Na queri abaixo o explain utiliza o indice
>
> SELECT id,
>        status,
>        content_id,
>        substring(content from '"maximumDeliveryDate":\"(.*?)\",')::DATE AS
> maximum_delivery_date,
>        substring(content from '"customerId":(.*?),') AS customer_id,
>        substring(content from '"method":"(.*?)"') AS method,
>        substring(content from '"createdDate":\"(.*?)\",') AS
> created_date_message,
>        substring(content from '"placeId":"(.*?)",') AS placeId,
>        created_date
> FROM message
> WHERE message_type_id IN ('ITEM_PRICE')
>   AND status IN ('DONE', 'INITIAL')
>   AND origin = 'ATG'
>   AND destination = 'BUS'
>   AND created_date >= '2014-11-12 06:00'
> ORDER BY maximum_delivery_date ASC;
>
>
> "Sort  (cost=860357.09..860357.18 rows=33 width=488)"
> "  Sort Key: (("substring"(content,
> '"maximumDeliveryDate":\"(.*?)\",'::text))::date)"
> "  ->  Index Scan using
> message_message_type_id_created_date_status_origin_destinat_idx on message
> (cost=0.00..860356.26 rows=33 width=488)"
> "        Index Cond: (((message_type_id)::text = 'ITEM_PRICE'::text) AND
> (created_date >= '2014-11-12 06:00:00-02'::timestamp with time zone) AND
> ((status)::text = ANY ('{DONE,INITIAL}'::text[])) AND ((origin)::text =
> 'ATG'::text) AND ((destination)::text = (...)"
>
> Mas quando adicion mais um status na cláusula IN o postgres não utiliza o
> indice
>
> (...)
>   AND status IN ('DONE', 'INITIAL', 'PROCESSED')
>   AND origin = 'ATG'
>   AND destination = 'BUS'
>   AND created_date >= '2014-11-12 06:00'
> ORDER BY maximum_delivery_date ASC
>
> "Sort  (cost=901932.88..901932.96 rows=33 width=488)"
> "  Sort Key: (("substring"(content,
> '"maximumDeliveryDate":\"(.*?)\",'::text))::date)"
> "  ->  Seq Scan on message  (cost=0.00..901932.05 rows=33 width=488)"
> "        Filter: ((created_date >= '2014-11-12 06:00:00-02'::timestamp
> with time zone) AND ((message_type_id)::text = 'ITEM_PRICE'::text) AND
> ((origin)::text = 'ATG'::text) AND ((destination)::text = 'BUS'::text) AND
> ((status)::text = ANY ('{DONE,INITIAL,PR (...)"
>
>
> Alguém poderia me orientar quanto a este comportamento? Minhas queries
> estão demorando muito por causa dele.
>

Antes de mais nada, nos informe a versão completa do PostgreSQL que está
sendo utilizado e execute um analyze em sua base para atualizar as
estatísticas.

Quantos destes "status" você tem possíveis? Uma das possíveis causas seria
que o número de ocorrências que contém um dos três "status" seja tão grande
que o otimizador prefere fazer um seq scan do que utilizar o índice, porém
faça o analyze primeiro, para termos um plano atualizado e adequado para
analisar.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a