Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1U4srp-0006vN-Ok for pgsql-performance@arkaria.postgresql.org; Mon, 11 Feb 2013 12:52:18 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.72) (envelope-from ) id 1U4sro-0006Vw-PE for pgsql-performance@arkaria.postgresql.org; Mon, 11 Feb 2013 12:52:16 +0000 Received: from magus.postgresql.org ([87.238.57.229]) by malur.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1U4srn-0006Vr-Sc for pgsql-performance@postgresql.org; Mon, 11 Feb 2013 12:52:15 +0000 Received: from mail-gh0-f170.google.com ([209.85.160.170]) by magus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1U4srj-0005hM-Qa for pgsql-performance@postgresql.org; Mon, 11 Feb 2013 12:52:15 +0000 Received: by mail-gh0-f170.google.com with SMTP id g14so1239737ghb.29 for ; Mon, 11 Feb 2013 04:52:09 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:x-gm-message-state; bh=Sa1OOHU2a0gmfSRSsncEwPVLibYcm4OA781Hm+e+zUU=; b=cniFrlTSpARzVoD07VdGfcwjAUNWwnxSbKH7P3FqhmnQo7yWIxfrle8+UfW6AneoT7 +lb9OfZscmWVdtOh3kQVYEoOLG4DCBkr2B1H5SDKLYNxtW8NqOKEtJbJV6l1+ut0hBqJ HndNYlguzagD8puDUq6jycuqjoS5ZbsuK7aDgCP+RH83fSfQ/jxvE22To1Y7azaL6adz McsxljAnPY9jJfUCd3ukSSJgTw/M8wZtWCgW1Hqi8C16QtDLp4nJv+13pI3cMEt+bQem d8UkGZAP/eC6xh0i16dNpMmlkE1DIz49/5LMQo49tij8h0HJZWVT8mQzCUYbp137gyaI nfMQ== X-Received: by 10.236.142.4 with SMTP id h4mr17277555yhj.58.1360587129789; Mon, 11 Feb 2013 04:52:09 -0800 (PST) Received: from [192.168.1.3] ([177.157.238.88]) by mx.google.com with ESMTPS id r16sm36386829ank.10.2013.02.11.04.52.08 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 11 Feb 2013 04:52:09 -0800 (PST) Message-ID: <5118E977.7050109@objectdata.com.br> Date: Mon, 11 Feb 2013 10:52:07 -0200 From: Alexandre Riveira User-Agent: Mozilla/5.0 (X11; Linux i686; rv:10.0.7) Gecko/20120824 Thunderbird/10.0.7 MIME-Version: 1.0 To: pgsql-performance@postgresql.org Subject: Is it correct to optimize a query with subselect in the "where"? Content-Type: multipart/alternative; boundary="------------020607090600050000020405" X-Gm-Message-State: ALoCoQn9K9EXBEoueMXT8MTzFh78QPuVelW59+/tKEBFn+6cw8Q/pyZChXavOz8GMAvqLtKBmfRq X-Pg-Spam-Score: 2.2 (++) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-performance Precedence: bulk Sender: pgsql-performance-owner@postgresql.org This is a multi-part message in MIME format. --------------020607090600050000020405 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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 --------------020607090600050000020405 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit
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



--------------020607090600050000020405--