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 = ""> 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 |