Page 1 of 2

Consulta Mysql

Posted: Thu Oct 25, 2018 6:13 pm
by FranciscoA
Hola amigos.
Tengo el siguiente codigo que funciona... pero considero que es muy lento (en una tabla con 50.000 registros se toma 20 segundos)
Tiene alguno de ustedes la menera de agilizar esta consulta?
Si le quito el having, se toma unicamente .90 secs. ( con el SqlYog)

Code: Select all

SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas  
GROUP BY numdoc 
HAVING SUM(debe-haber) > 0;
Saludos.

Re: Consulta Mysql

Posted: Thu Oct 25, 2018 9:51 pm
by carlos vargas
me pareciera que necesitas agregar un order by
ya que la el having sum(debe-haber) no esta noptimizado, asumiendo que la tabla este ordenada por fechamis y numdoc

Re: Consulta Mysql

Posted: Thu Oct 25, 2018 10:38 pm
by FranciscoA
Carlos, gracias por contestar.

Code: Select all

SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas  
GROUP BY numdoc 
HAVING SUM(debe-haber) > 0 ORDER BY numdoc;
 
No hay ninguna diferencia. La tabla fue creada con el index numdoc.
Saludos.

Re: Consulta Mysql

Posted: Thu Oct 25, 2018 11:25 pm
by cmsoft
Prueba con esto a ver si mejora:

Code: Select all

SELECT res.fechemis,res.numdoc, res.debitos, res.creditos, res.diferencia from (
SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas  
GROUP BY numdoc ) res
where res.diferencia > 0 ORDER BY res.numdoc;
 
Con 280000 registros tarda 5 seg.

Re: Consulta Mysql

Posted: Thu Oct 25, 2018 11:26 pm
by admsoporte
Si esta muy lenta la consulta, deberias agregar un indice para acelerar el proceso.

Re: Consulta Mysql

Posted: Fri Oct 26, 2018 5:20 pm
by FranciscoA
cmsoft wrote:Prueba con esto a ver si mejora:

Code: Select all

SELECT res.fechemis,res.numdoc, res.debitos, res.creditos, res.diferencia from (
SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas  
GROUP BY numdoc ) res
where res.diferencia > 0 ORDER BY res.numdoc;
 
Con 280000 registros tarda 5 seg.
Gracias, cmsoft. Lo voy a probar y luego te comento.

Re: Consulta Mysql

Posted: Fri Oct 26, 2018 5:21 pm
by FranciscoA
admsoporte .
Gracias por contestar.
Ya lo he probado como comentas, y el mismo resultado.

Re: Consulta Mysql

Posted: Fri Oct 26, 2018 5:36 pm
by FranciscoA

Code: Select all

oCuadrar := oServer:Query("SELECT res.fechemis,res.numdoc, res.debitos, res.creditos, res.diferencia from (" +;
"  SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia " +;
" FROM facturas" +;  
" GROUP BY numdoc ) res" +;
" WHERE res.diferencia > 0 ORDER BY res.numdoc;")
 
increible. El tiempo por 98.000 registros es de 61 segundos. Extremadamente lento.
No lo entiendo.

Re: Consulta Mysql

Posted: Fri Oct 26, 2018 5:38 pm
by carlos vargas
Francisco podemos verlo por teamviewer?
me avisas por karlos.vargas at gmail.com


salu2
carlos vargas

Re: Consulta Mysql

Posted: Fri Oct 26, 2018 6:11 pm
by FranciscoA
FranciscoA wrote:

Code: Select all

oCuadrar := oServer:Query("SELECT res.fechemis,res.numdoc, res.debitos, res.creditos, res.diferencia from (" +;
"  SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia " +;
" FROM facturas" +;  
" GROUP BY numdoc ) res" +;
" WHERE res.diferencia > 0 ORDER BY res.numdoc;")
 
increible. El tiempo por 98.000 registros es de 61 segundos. Extremadamente lento.
No lo entiendo.
Disculpa, cmsoft. Error mio por haber copiado, pegado y compilado, olvidando que en mi programa lo tengo en un DO WHILE en el que proceso varias tablas mysql.
Lo he corregido, sin embargo el tiempo unicamente a bajado a 17.25 segundos, el cual es malo, comparado con tu ejemplo.
Gracias.

Re: Consulta Mysql

Posted: Fri Oct 26, 2018 6:21 pm
by FranciscoA
Carlos.
Muchas gracias por tu interés.
He optado por separar la función, del procedimiento general de actualización de saldos, ya que ésta únicamente la he creado para re-confirmar si las transacciones balancean.
Me he decidido por lo anterior, en vista de que antes de grabar cada documento, se chequean sus transacciones.
Todo se debe a que el usuario debe tener la seguridad de que todo está bien antes de emitir los Estados Financieros.

Re: Consulta Mysql

Posted: Fri Oct 26, 2018 7:31 pm
by oliveiros junior
Olá Francisco,

Desculpe me intrometer mas acho que na sua query faltou após o comando sum() o AS para ligar a variavel: ex SUM( haber ) AS CREDITO.

Att.,

Oliveiros Junior

Re: Consulta Mysql

Posted: Fri Oct 26, 2018 9:45 pm
by FranciscoA
Oliveiros.
Todo lo contrario, agradezco tu interés en ayudarme.
En alguna parte del manual he visto que AS es opcional:
"Aprovechemos la ocasión para mencionar que también es posible asignar un alias a cualquiera de las expresiones select. Esto se puede hacer usando la palabra AS, aunque esta palabra es opcional".:
Saludos.

Re: Consulta Mysql

Posted: Sat Oct 27, 2018 10:35 am
by Carlos Mora
Hola Francisco,
FranciscoA wrote: Si le quito el having, se toma unicamente .90 secs. ( con el SqlYog)

Code: Select all

SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas  
GROUP BY numdoc 
HAVING SUM(debe-haber) > 0;
Saludos.
¿Podrías probar

Code: Select all

SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas  
GROUP BY numdoc
WHERE debitos > creditos
o

Code: Select all

 HAVING debitos > creditos
El resultado deberia ser el mismo, solo que la condicion no está sobre un campo calculado. lo que sospecho que le está dando más trabajo. De hecho la columna diferencia se podría suprimir y en el codigo usar la diferencia de las columnas debitos y creditos.

Re: Consulta Mysql

Posted: Sat Oct 27, 2018 3:00 pm
by FranciscoA
Carlos Mora wrote:Hola Francisco,
¿Podrías probar

Code: Select all

SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas  
GROUP BY numdoc
WHERE debitos > creditos
o

Code: Select all

 HAVING debitos > creditos
El resultado deberia ser el mismo, solo que la condicion no está sobre un campo calculado. lo que sospecho que le está dando más trabajo. De hecho la columna diferencia se podría suprimir y en el codigo usar la diferencia de las columnas debitos y creditos.
Hola Carlos.
La primera opcion da el error:
Query: SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia FROM facturas GROUP BY numdoc WHERE ...

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE debitos > creditos
La segunda tarda 16.046 secs, sobre 59.605 registros.

Gracias por tu interes.