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 | Expand
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 | Expand
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 | Expand
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 | Expand
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 | Expand
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 | Expand
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 | Expand
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 | Expand
SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas
GROUP BY numdoc
WHERE debitos > creditos
o
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 | Expand
SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas
GROUP BY numdoc
WHERE debitos > creditos
o
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.