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
