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

[SOLUCIONADO] Duda sobre rapidez en loops

Estas en el tema de Duda sobre rapidez en loops en el foro de PostgreSQL en Foros del Web. Hola: Esta es una duda muy general, y seguro que no esté diciendo nada importante, pero el caso es que tengo una función cuyo LOOP ...
  #1 (permalink)  
Antiguo 11/07/2015, 10:34
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Duda sobre rapidez en loops

Hola:

Esta es una duda muy general, y seguro que no esté diciendo nada importante, pero el caso es que tengo una función cuyo LOOP se basa en una cláusula WHILE

Código SQL:
Ver original
  1. WHILE x < (SELECT COUNT(*) FROM prueba4)

Forma parte de una función para añadir un caracter '0' a una tabla de códigos postales, en aquellos que tienen 4 caracteres.

Estamos hablando de 153.000 registros más o menos, y puede tardar bastantes minutos.

Y otra función hecha con FOR registro IN ..... va mucho más rápida, mas o menos 2-3 segundos.

Evidentemente no hacen lo mismo, pero me da la impresión de que la diferencia de rapidez está más en la forma de plantear el ciclo que en el contenido del mismo, ya que dicho contenido es muy básico en ambos casos.

¿Puede ser así?
Saludos y gracias.
__________________
Mi calculadora en Qt
  #2 (permalink)  
Antiguo 13/07/2015, 07:24
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Duda sobre rapidez en loops

Hola dehm

Realmente la diferencia si está mas en el contenido de la misma que en el ciclo como tal.
Todo depende de la rapidez de la consulta con la que se ejecute el ciclo.

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 14/07/2015, 05:56
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Duda sobre rapidez en loops

Tienes toda la razón.
Cuando escribí este mensaje no me paré realmente a evaluar el contenido del ciclo.

Creo, y a lo mejor digo de nuevo una tontería, que la diferencia (en el caso concreto que motivó mi consulta) entre una u otra forma se debió a que en una forma planteé el contenido del bucle así:
Código SQL:
Ver original
  1. DECLARE
  2.     x INTEGER;
  3.     registro RECORD;
  4. BEGIN
  5.     x:=1;
  6.     --WHILE x < (SELECT COUNT(*) FROM prueba4)
  7.     FOR registro IN SELECT * FROM prueba4 ORDER BY id
  8.     LOOP
  9.         IF LENGTH(registro.cp)<5 THEN
  10.         UPDATE prueba4 SET cp=(lpad (cp,5,'0'))WHERE prueba4.id=x;
  11.         RAISE NOTICE'(%)',registro.cp;
  12.         END IF;
  13.         --RAISE NOTICE'(%)',x;
  14.         x:=x+1;
  15.     END LOOP;
  16. END;

y en la otra así:
Código SQL:
Ver original
  1. DECLARE
  2.     x INTEGER;
  3. BEGIN
  4.     x:=1;
  5.     WHILE x < (SELECT COUNT(*) FROM prueba4)
  6.     LOOP
  7.         UPDATE prueba4 SET cp=(lpad (cp,5,'0'))WHERE prueba4.id=x AND LENGTH(cp)<5;
  8.         --RAISE NOTICE'(%)',cp.cp;
  9.         x:=x+1;
  10.     END LOOP;
  11. END;

Pienso que la doble condición del UPDATE unido a que no hay previamente una cláusula IF que elimine algunos registros fue el determinante de que una operación fuese casi instantánea y la otra se llevase su tiempo.

Yo soy novato en las BBDD así que si digo muchas tonterías me lo decís

Y digo yo, si esto es así....¿cuando alguien trabaja con BBDD "de verdad" con millones de registros, ha de plantearse y hacer pruebas de rapidez antes de lanzarse a hacer un UPDATE o cualquier otra operación, con vistas a ahorrar tiempo?
__________________
Mi calculadora en Qt
  #4 (permalink)  
Antiguo 14/07/2015, 07:35
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Duda sobre rapidez en loops

Claro que si.

Para este tipo de operaciones a gran escala y de procesamiento de millones de registros, existen los planes de ejecución, donde postgresql o cualquier otro motor de bases de datos decente, basado en las estadísticas y el movimiento de registros, nos indica la ruta que tomaría las sentencias y el costo que esto implicaría antes de ejecutar la sentencia.

Previamente, el especialista en bases de datos analiza este plan de ejecución y decide si es viable o no su ejecución.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 14/07/2015, 07:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Duda sobre rapidez en loops

Cuando se trabaja productivamente en bases de datos empresariales, cambios menores des escenario, obligan a cambiar completamente la estrategia de una consulta. Y a veces una consulta "perfecta" con dos millones de registros, deja de ser buena cuando llegas a tres millones.
Por eso el análisis de la optimización se debe hacer también periódicamente.

Tengo casos de consultas y procesos que anduvieron maravillosamente durante varios años, y un buen día empezaron a caer en error.
¿Por qué?
Porque por obligaciones legales se agregó un dato a una tabla, y se sumo ese dato como parámetro en las consultas, pero ese dato destruyó la performance de mas de una query...

Hubo que rehacer la lógica de más de una decena de SP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 14/07/2015, 08:51
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Duda sobre rapidez en loops

Muchas gracias por las respuestas!
__________________
Mi calculadora en Qt

Etiquetas: loops, rapidez, tabla
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 02:08.