Consulta Mysql

User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Consulta Mysql

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

Fwxh1204-MySql-TMySql
User avatar
carlos vargas
Posts: 1421
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Consulta Mysql

Post 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
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

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

Fwxh1204-MySql-TMySql
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Consulta Mysql

Post 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.
Last edited by cmsoft on Thu Oct 25, 2018 11:30 pm, edited 1 time in total.
admsoporte
Posts: 79
Joined: Sun Oct 09, 2005 3:09 pm
Location: Mexico

Re: Consulta Mysql

Post by admsoporte »

Si esta muy lenta la consulta, deberias agregar un indice para acelerar el proceso.
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

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

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

Re: Consulta Mysql

Post by FranciscoA »

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

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

Re: Consulta Mysql

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

Fwxh1204-MySql-TMySql
User avatar
carlos vargas
Posts: 1421
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Consulta Mysql

Post by carlos vargas »

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
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

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

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

Re: Consulta Mysql

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

Fwxh1204-MySql-TMySql
oliveiros junior
Posts: 84
Joined: Tue Mar 20, 2007 3:13 pm

Re: Consulta Mysql

Post 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
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

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

Fwxh1204-MySql-TMySql
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Consulta Mysql

Post 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.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Consulta Mysql

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

Fwxh1204-MySql-TMySql
Post Reply