Consulta Mysql

Consulta Mysql

Postby FranciscoA » Thu Oct 25, 2018 6:13 pm

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 view
SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas  
GROUP BY numdoc
HAVING SUM(debe-haber) > 0;

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

Postby carlos vargas » Thu Oct 25, 2018 9:51 pm

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
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1719
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Consulta Mysql

Postby FranciscoA » Thu Oct 25, 2018 10:38 pm

Carlos, gracias por contestar.

Code: Select all  Expand view
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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

Postby cmsoft » Thu Oct 25, 2018 11:25 pm

Prueba con esto a ver si mejora:
Code: Select all  Expand view

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.
Last edited by cmsoft on Thu Oct 25, 2018 11:30 pm, edited 1 time in total.
User avatar
cmsoft
 
Posts: 1285
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Consulta Mysql

Postby admsoporte » Thu Oct 25, 2018 11:26 pm

Si esta muy lenta la consulta, deberias agregar un indice para acelerar el proceso.
admsoporte
 
Posts: 103
Joined: Sun Oct 09, 2005 3:09 pm
Location: Mexico

Re: Consulta Mysql

Postby FranciscoA » Fri Oct 26, 2018 5:20 pm

cmsoft wrote:Prueba con esto a ver si mejora:
Code: Select all  Expand view

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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

Postby FranciscoA » Fri Oct 26, 2018 5:21 pm

admsoporte .
Gracias por contestar.
Ya lo he probado como comentas, y el mismo resultado.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

Postby FranciscoA » Fri Oct 26, 2018 5:36 pm

Code: Select all  Expand view
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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

Postby carlos vargas » Fri Oct 26, 2018 5:38 pm

Francisco podemos verlo por teamviewer?
me avisas por karlos.vargas at gmail.com


salu2
carlos vargas
Last edited by carlos vargas on Fri Oct 26, 2018 7:28 pm, edited 1 time in total.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1719
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Consulta Mysql

Postby FranciscoA » Fri Oct 26, 2018 6:11 pm

FranciscoA wrote:
Code: Select all  Expand view
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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

Postby FranciscoA » Fri Oct 26, 2018 6:21 pm

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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

Postby oliveiros junior » Fri Oct 26, 2018 7:31 pm

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
oliveiros junior
 
Posts: 125
Joined: Tue Mar 20, 2007 3:13 pm

Re: Consulta Mysql

Postby FranciscoA » Fri Oct 26, 2018 9:45 pm

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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

Postby Carlos Mora » Sat Oct 27, 2018 10:35 am

Hola Francisco,

FranciscoA wrote:Si le quito el having, se toma unicamente .90 secs. ( con el SqlYog)
Code: Select all  Expand view
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 view
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  Expand view
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.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Consulta Mysql

Postby FranciscoA » Sat Oct 27, 2018 3:00 pm

Carlos Mora wrote:Hola Francisco,
¿Podrías probar
Code: Select all  Expand view
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  Expand view
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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 41 guests