Ver Mensaje Individual
  #3 (permalink)  
Antiguo 14/07/2015, 05:56
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 2 meses
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