0

我必须优化一个相当长的复杂查询,其中包含多个查询。有一个作为第三代 SELECT 重复多次的子查询:

(SELECT mc.cotmoneda2 FROM monedacotizaciones mc  WHERE date(mc.`FechaHora`)<= date( p.Fechacreacion) AND mc.tipo=0 order by mc.`FechaHora`desc limit 1))

这是完整查询的简化版本:

SELECT p.ID
  ,p.Tipo
  , p.Numero
  , p.Nombre
  , e.Empresa
  ,(CASE p.NroMoneda WHEN 1 Then (SELECT sum(fi.ImportePrecio1/(SELECT mc.cotmoneda2 FROM monedacotizaciones mc  where date(mc.`FechaHora`)<= date( p.Fechacreacion) and mc.tipo=0 order by mc.`FechaHora`desc limit 1))
                                    FROM facturasitems fi inner join facturas f on (fi.idFactura= f.Recid)
                                    where (f.estado =0 or f.estado =1 or f.estado =3 ) and  f.idpedido = p.`recid`)

                       ELSE  (SELECT sum(fi.ImportePrecio2)
                             FROM facturasitems fi inner join facturas f on (fi.idFactura= f.Recid)
                             where (f.estado =0 or f.estado =1 or f.estado =3 ) and  f.idpedido = p.`recid`) end) as FacturadoUSA

  ,(SELECT sum(Ci.ImportePrecio1/(SELECT mc.cotmoneda2 FROM monedacotizaciones mc  where date(mc.`FechaHora`)<= date( p.Fechacreacion) and mc.tipo=0 order by mc.`FechaHora`desc limit 1))
     FROM Comprasitems ci inner join Compras C on (ci.idCompra= C.Recid)
     WHERE (c.estado =0 OR c.estado =1 ) AND C.idpedido = p.`recid`) as CostoRealUSA


  ,(SELECT sum(dgv.importe/(SELECT mc.cotmoneda2 FROM monedacotizaciones mc  where date(mc.`FechaHora`)<= date( p.Fechacreacion) and mc.tipo=0 order by mc.`FechaHora`desc limit 1))
    FROM detalles_gastosvarios23 dgv
    where dgv.idref = p.Recid) as GastosReales


FROM Pedidos p INNER JOIN  `contactos` ON (p.`idref`=`contactos`.`idcontacto`)
           INNER JOIN `empresas` e ON (contactos.`idempresa`= e.`idempresa`)
           INNER JOIN `talonarios` ON (`talonarios`.`recid`= p.`idtalonario`)
WHERE  (p.`fechacreacion` BETWEEN '<%fechainicio%>' AND '<%fechafin%>')
  AND talonarios.NroSucursal =1
GROUP BY p.Numero

我想要做的是创建一个包含子查询的用户变量,以便为每条记录重新评估它,但每条记录只重新评估一次。它现在的工作方式,但需要 3 多分钟!我已经多次尝试了许多不同的选项,但看起来我的语法不正确。问题是用户变量子查询包含对 p 的引用。

谢谢,对不起我的英语不好。

4

1 回答 1

0

我想说加快查询速度的一种方法是创建一个临时表。可能还有其他方法,但这是一种方法。使它变慢的部分原因是所有条件,例如“f.estado = 0 OR f.estado = 1 OR f.estado = 3”等......一遍又一遍地重复。如果您的临时表仅包含满足这些条件的记录列表,它会运行得更快。

SELECT <Desired Columns>
INTO #<TableName>
FROM facturasitems fi inner join facturas f on (fi.idFactura= f.Recid)
WHERE (f.estado =0 or f.estado =1 or f.estado =3 ) and  f.idpedido = p.`recid`)

那么您的一个查询可能看起来像

SELECT sum(fi.ImportePrecio2)
FROM #<TableName>

您的查询将不再需要每次都查看所有这些条件。

于 2016-03-16T20:26:21.430 回答