pg.ddx.io  pgsql-performance@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Alexandre Riveira <alexandre@objectdata.com.br>
To: pgsql-performance@postgresql.org
Subject: Is it correct to optimize a query with subselect in the "where"?
Date: Mon, 11 Feb 2013 10:52:07 -0200
Message-ID: <5118E977.7050109@objectdata.com.br> (raw)
List-Unsubscribe:  <mailto:majordomo@postgresql.org?body=unsub%20pgsql-performance>

I managed to optimize the query below, adding a subselect (is disabled) 
after the "where" it would be correct?

EXPLAIN (ANALYZE, BUFFERS) SELECT CONCAT_WS(' # ',
CONCAT_WS(' ', produto.descricao, produto_watts.descricao, 
produto_serie.descricao, produto_tecnologia.descricao, 
produto_modelo.descricao),
produto_cliente.descricao) as produto_descricao,
produto.id as produto_id,
produto.codigo as produto_codigo,
produto.descricao2 as descricao2,
produto.descricao_extendida as produto_descricao_extendida,
produto.referencia as referencia,
estoque.id as estoque_id,
estoque.localizacao as localizacao,
estoque.data_disponibilidade as data_disponibilidade,
estoque.quantidade - estoque.quantidade_temporaria as quantidade_disponivel,
estoque.quantidade as quantidade_estoque,
estoque.quantidade_temporaria as quantidade_temporaria,
produto_unidade_medida.casa_decimal as casa_decimal,
produto_grade.descricao as grade,
financeiro_moeda_cotacao.preco_venda as cotacao,
preco.moeda_id as moeda_id,
CASE WHEN (empresa.pedido_moeda_id IS NULL AND 
financeiro_moeda_cotacao.preco_venda IS NOT NULL) THEN (preco.preco1 * 
financeiro_moeda_cotacao.preco_venda) ELSE preco.preco1 END as preco1,
CASE WHEN (empresa.pedido_moeda_id IS NULL AND 
financeiro_moeda_cotacao.preco_venda IS NOT NULL) THEN (preco.preco2 * 
financeiro_moeda_cotacao.preco_venda) ELSE preco.preco2 END as preco2,
CASE WHEN (empresa.pedido_moeda_id IS NULL AND 
financeiro_moeda_cotacao.preco_venda IS NOT NULL) THEN (preco.preco3 * 
financeiro_moeda_cotacao.preco_venda) ELSE preco.preco3 END as preco3,
CASE WHEN (empresa.pedido_moeda_id IS NULL AND 
financeiro_moeda_cotacao.preco_venda IS NOT NULL) THEN (preco.preco4 * 
financeiro_moeda_cotacao.preco_venda) ELSE preco.preco4 END as preco4,
produto_fabricante.descricao as fabricante
FROM produto
INNER JOIN produto_venda ON produto.id = produto_venda.produto_id
INNER JOIN empresa ON produto_venda.empresa_id = empresa.id
LEFT JOIN produto_cliente ON produto_cliente.produto_id = produto.id -- 
AND produto_cliente.cliente_id = ?
LEFT JOIN produto_fabricante ON produto.fabricante_id = 
produto_fabricante.id
LEFT JOIN produto_serie ON produto.serie_id = produto_serie.id
LEFT JOIN produto_tecnologia ON produto.tecnologia_id = 
produto_tecnologia.id
LEFT JOIN produto_watts ON produto.watts_id = produto_watts.id
LEFT JOIN produto_modelo ON produto.modelo_id = produto_modelo.id
LEFT JOIN produto_classe ON produto.classe_id = produto_classe.id
LEFT JOIN produto_familia ON produto.familia_id = produto_familia.id
LEFT JOIN produto_porcentagem ON produto.porcentagem_id = 
produto_porcentagem.id
LEFT JOIN produto_unidade_medida ON produto.unidade_medida_id = 
produto_unidade_medida.id
LEFT JOIN preco ON preco.produto_id = produto.id
LEFT JOIN estoque ON estoque.produto_id = produto.id
LEFT JOIN financeiro_moeda_cotacao ON financeiro_moeda_cotacao.moeda_id 
= preco.moeda_id AND financeiro_moeda_cotacao.data = CURRENT_DATE
LEFT JOIN produto_grade ON estoque.grade_id = produto_grade.id
WHERE (
   produto_venda.empresa_id = 1 AND
   produto_venda.venda = 't' AND
   preco.tabela_id = 4 AND
   estoque.deposito_id = '2' AND
   estoque.desativado = 'f'  AND
   (produto.id IN (SELECT produto_cliente.produto_id FROM 
produto_cliente WHERE (COMPAT_LIKE(produto_cliente.descricao) LIKE 
COMPAT_LIKE('broca') OR COMPAT_LIKE(produto_cliente.descricao) LIKE 
COMPAT_LIKE('%broca%') AND cliente_id = 3680) )
   OR
   (
   --produto.id IN (
   --SELECT produto.id FROM produto WHERE
   COMPAT_LIKE(produto.codigo) LIKE COMPAT_LIKE('broca%') OR
   COMPAT_LIKE(produto.descricao) LIKE COMPAT_LIKE('%broca%')  OR
   COMPAT_LIKE(produto.referencia) LIKE COMPAT_LIKE('%broca%')
   --)
   )
   )
   )
   ORDER BY produto.descricao, grade, (estoque.quantidade - 
estoque.quantidade_temporaria) desc LIMIT 10

without subselect http://explain.depesz.com/s/Qec
with subselect http://explain.depesz.com/s/936a

Tank's

Alexandre Riveira

Message-ID: <5118E977.7050109@objectdata.com.br>
Permalink:  ../5118E977.7050109@objectdata.com.br/
Also on:    postgresql.org/message-id/5118E977.7050109@objectdata.com.br

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-performance@postgresql.org
  Cc: alexandre@objectdata.com.br
  Subject: Re: Is it correct to optimize a query with subselect in the "where"?
  In-Reply-To: <5118E977.7050109@objectdata.com.br>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox