Ver Mensaje Individual
  #13  
Antiguo 03-09-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Reputación: 25
__cadetill Va por buen camino
Antes de empezar con el rollo...... AGAG4, te he editado el mensaje para poner la etiqueta [ sql ] (sin espacios). Mírate el funcionamiento de ésta y otras leyendo el primer mensaje del cualquier foro.


Ahora, al grano:

Veamos, lo que el amigo AGAG4 quiere, si no he entendido mal, es lo siguiente:


Como vemos, se lanzan muuuchas subselect, por lo que, por mucho que diga el amigo Marc de poner/crear los índices adecuados ( ), siento no estar de acuerdo con él. Quiera o no, esta multitud de subselect se vuelve muy lento. Además hay que tener presente que alguna de estas consultas (si TOPE no es índice o Unique) puede devolver más de 1 fila, por lo que habría que poner la cláusula distinct y esto aun lo haría más lento.

Quizás con tablas pequeñas la diferencia sea poca, pero con tablas con muchos datos......
He realizado mis pruebas contra una tabla de más de 250 mil de registros en DB400 (DB2 para AS400) con las sentencias siguientes sentencias SQL

SQL1
Código SQL [-]
select 
  (select max(campo1) from tabla),
  (select campo2 from tabla where campo1 = (select max(campo1) from tabla) ),
  (select distinct campo3 from tabla where campo1 = (select max(campo1) from tabla) ),
  (select min(campo1) from tabla),
  (select campo2 from tabla where campo1 = (select min(campo1) from tabla) ),
  (select distinct campo3 from tabla where campo1 = (select min(campo1) from tabla) ),
from tiqcap
SQL2
Código SQL [-]
select campo1, campo2, campo3
from tabla
where
  campo1 = (select max(campo1) from tabla) or campo1 = (select min(campo1) from tabla)
SQL3
Código SQL [-]
select campo1, campo2, campo3
from tabla
where
  campo1 = (select max(campo1) from tabla)
UNION
select campo1, campo2, campo3
from tabla
where
  campo1 = (select min(campo1) from tabla)
Con los siguientes resultados:
SQL1: 1:57.213
SQL2: 0:07.411
SQL3: 0:10.175

Como véis, en el SQL1 he tenido que poner un distinct ya que esa subconsulta me devolvía más de un resultado. Por otro lado, también es cierto que con SQL1 tenemos exactamente lo que queremos, pero con un gran coste. Quizás mejor programar 4 lineas de código y reducir el coste de la consulta de forma drástica.

Creo que hay una clara diferencia entre la cantidad de subselects y los demás métodos, siendo el más rápido el propuesto por el amigo scooterjgm.

Lo que no he probado es lo del procedimiento almacenado, pero supongo que los tiempos serán por el estilo al SQL2 y SQL3

Pues nada, estas han sido las pruebas

Espero que os sean de utilidad
Responder Con Cita