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

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', '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.

Abraços

-- 
Flávio Alves Granato
gpg: 968F:A938:70B9:82C7:5198:2C74:13CB:2C25:EF1E:726D
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a