Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Como Optimizar validacion

Estas en el tema de Como Optimizar validacion en el foro de Mysql en Foros del Web. Buenos días , necesito ayuda, Tengo un sistema con mucha información , y cada vez se va hacer un registro tengo que hacer 26 validaciones, ...
  #1 (permalink)  
Antiguo 03/05/2014, 09:35
 
Fecha de Ingreso: marzo-2008
Mensajes: 6
Antigüedad: 16 años, 1 mes
Puntos: 0
Como Optimizar validacion

Buenos días , necesito ayuda,

Tengo un sistema con mucha información , y cada vez se va hacer un registro tengo que hacer 26 validaciones, cada una de las cuales tiene que consultar en la base de datos, con sentencias como las siguientes:

SELECT ifnull(count(*), 0) FROM documento r, pago p where r.f_fecha < '" . $año . "-" . $mes . "-01' and r.i_codigo = p.i_cod_registro and p.i_tip_doc = 1 and p.i_tip_pago = 1 and r.i_oficina = '" . $oficina . "'";

El problema esta en que ciertas consultas como la anterior tiene un tiempo de duracion de 30 segundos, ahora imaginense que son 26 validaciones.

Esto puede hacer que cada registro tome un tiempo de más de 15 minutos, si es que no se bloquea antes.


Como puedo optimizar o solucionar para reducir los tiempos si las validaciones son necesarias y hay que mantenerlas.
  #2 (permalink)  
Antiguo 04/05/2014, 01:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Como Optimizar validacion

Preguntas:
1) No entiendo por qué usas IFNULL si no haces LEFT JOIN. Si solo buscas en documentos que estén relacionados con pagos, no es necesario el IFNULL.
2) Yo en lugar de
Código MySQL:
Ver original
  1. WHERE ... r.i_codigo = p.i_cod_registro
usaría... INNER JOIN... ON. Es decir,
Código MySQL:
Ver original
  1. SELECT... FROM documento r INNER JOIN pago p ON r.i_codigo = p.i_cod_registro
(ambos campos deben ser PK y FK, respectivamente. No olvides indexar i_cod_registro)
y luego el WHERE con lo demás.
3) no entiendo qué es lo que quieres contar y por qué agruparías. Ahora estás contando pero sin agrupar por nada. Dinos exactamente qué quieres contar. Tal vez quieres contar los códigos, etc. Aclaranos eso.

Y dinos también cuál es la naturaleza de esas validaciones de las que hablas.

Última edición por jurena; 04/05/2014 a las 02:01
  #3 (permalink)  
Antiguo 04/05/2014, 07:27
 
Fecha de Ingreso: marzo-2008
Mensajes: 6
Antigüedad: 16 años, 1 mes
Puntos: 0
Busqueda Respuesta: Como Optimizar validacion

Uso IFNULL para que en caso de que la consulta tenga informacion me traiga el numero de registros encontrados y en caso de que no me devuelva 0 , de esa forma puedo hacer la siguiente validacion e informar si hace falta algo antes de continuar. El IFNULL junto al COUNT me ha ayudado a disminuir tiempos pero no es suficiente.

Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.


Cita:
Iniciado por jurena Ver Mensaje
Preguntas:
1) No entiendo por qué usas IFNULL si no haces LEFT JOIN. Si solo buscas en documentos que estén relacionados con pagos, no es necesario el IFNULL.
2) Yo en lugar de
Código MySQL:
Ver original
  1. WHERE ... r.i_codigo = p.i_cod_registro
usaría... INNER JOIN... ON. Es decir,
Código MySQL:
Ver original
  1. SELECT... FROM documento r INNER JOIN pago p ON r.i_codigo = p.i_cod_registro
(ambos campos deben ser PK y FK, respectivamente. No olvides indexar i_cod_registro)
y luego el WHERE con lo demás.
3) no entiendo qué es lo que quieres contar y por qué agruparías. Ahora estás contando pero sin agrupar por nada. Dinos exactamente qué quieres contar. Tal vez quieres contar los códigos, etc. Aclaranos eso.

Y dinos también cuál es la naturaleza de esas validaciones de las que hablas.

Última edición por gnzsoloyo; 04/05/2014 a las 10:17
  #4 (permalink)  
Antiguo 04/05/2014, 10:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como Optimizar validacion

En los foros de Bases de DAtos las soluciones son en SQL. Si quieres soluciones para PHP u otro lenguaje, muevo tu post al foro correspondiente.

Cita:
Uso IFNULL para que en caso de que la consulta tenga informacion me traiga el numero de registros encontrados y en caso de que no me devuelva 0 , de esa forma puedo hacer la siguiente validacion e informar si hace falta algo antes de continuar. El IFNULL junto al COUNT me ha ayudado a disminuir tiempos pero no es suficiente.
Lo que te quiere decir @jurena es que si no devuelve registros, tampoco devolverá un NULL en ninguna parte, sino sólo una tabla vacía, con los nombres de la columnas, pero sin registros. En ese caso el IFNULL() no opera, ya que requiere que exista al menos un registro.
El COUNT(), por su lado, por definición no puede devolver NULL. Solo devuelve cero o un valor mayor a cero. El NULL se toma como cero en el COUNT(), pero para funcionar se requiere que la query devuelva al menos UN registro, y el INNER JOIN sólo devuelve registro si hay al menos UN registro que cumpla las condiciones del mismo.
El único caso donde que el COUNT() puede devolver algo en una consulta que devuelva un resultado vacío, es si es el único dato que pueda devolver:
Código SQL:
Ver original
  1. SELECT COUNT(*) total
  2. FROM tablaA T1 INNER JOIN tablaB T2 ON T1.idTablaA = T2.idTablaA
El IFNULL() sólo es realmente funcional si: 1) Usas LEFT JOIN, 2) Lo aplicas sobre un campo donde en un registro dado hay un NULL en la tabla, en un registro existente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 04/05/2014 a las 10:25
  #5 (permalink)  
Antiguo 04/05/2014, 12:41
 
Fecha de Ingreso: marzo-2008
Mensajes: 6
Antigüedad: 16 años, 1 mes
Puntos: 0
Pregunta Respuesta: Como Optimizar validacion

La solucion la estoy buscando para mysql, si pongo algo de php es para aclarar lo que hago despues y explicarle @jurena lo que realizo.

la setencia actual funciona bien, me informa si hay mas de un valor que es lo que necesito, el problema esta en que necesito que la consulta se demore menos, o realizar la misma consulta de alguna manera para que el tiempo se minimo, he probado lo que me escribio @jurena pero demora el mismo tiempo, los que campo que utilizo estan indexados.

que otras opciones puedo probar?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En los foros de Bases de DAtos las soluciones son en SQL. Si quieres soluciones para PHP u otro lenguaje, muevo tu post al foro correspondiente.



Lo que te quiere decir @jurena es que si no devuelve registros, tampoco devolverá un NULL en ninguna parte, sino sólo una tabla vacía, con los nombres de la columnas, pero sin registros. En ese caso el IFNULL() no opera, ya que requiere que exista al menos un registro.
El COUNT(), por su lado, por definición no puede devolver NULL. Solo devuelve cero o un valor mayor a cero. El NULL se toma como cero en el COUNT(), pero para funcionar se requiere que la query devuelva al menos UN registro, y el INNER JOIN sólo devuelve registro si hay al menos UN registro que cumpla las condiciones del mismo.
El único caso donde que el COUNT() puede devolver algo en una consulta que devuelva un resultado vacío, es si es el único dato que pueda devolver:
Código SQL:
Ver original
  1. SELECT COUNT(*) total
  2. FROM tablaA T1 INNER JOIN tablaB T2 ON T1.idTablaA = T2.idTablaA
El IFNULL() sólo es realmente funcional si: 1) Usas LEFT JOIN, 2) Lo aplicas sobre un campo donde en un registro dado hay un NULL en la tabla, en un registro existente.
  #6 (permalink)  
Antiguo 05/05/2014, 03:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Como Optimizar validacion

Infórmanos sobre el volumen de registros del que estamos hablando. Envíanos la estructura de la base o de las tablas implicadas para que nos hagamos una idea de qué tenemos. Con SHOW CREATE TABLE tbl_name nos ofrecerás la estructura de cada una de las tablas implicadas. Ahí veremos la estructura. Sobre el número de registros también deberías informarnos.
Pero tan importante como todo eso es saber exactamente qué quieres buscar y por qué razón. A veces una buena explicación nos ayuda a entender la naturaleza del problema. Algo así como quiero comprobar que el documento x tiene o no determinados pagos. Nosotros podremos ayudarte en el SQL, aunque para lo demás quizás tengas que recurrir a otros foros de forosdelweb.

Etiquetas: registro, select, validacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:56.