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

Rendimiento de una consulta

Estas en el tema de Rendimiento de una consulta en el foro de Bases de Datos General en Foros del Web. Un saludo y feliz año a todos. Hoy me ha asaltado una duda al hacer una consulta. Supongamos que tengo dos tablas t1 y t2, ...
  #1 (permalink)  
Antiguo 04/01/2010, 13:11
 
Fecha de Ingreso: enero-2010
Mensajes: 2
Antigüedad: 14 años, 4 meses
Puntos: 0
Rendimiento de una consulta

Un saludo y feliz año a todos.

Hoy me ha asaltado una duda al hacer una consulta. Supongamos que tengo dos tablas t1 y t2, la primera bastante mayor que la segunda y que están relacionadas con una clave (pongamos que se llama k en ambas tablas):

SELECT *
FROM
t1 LEFT JOIN t2 ON t1.k=t2.k;

Hasta aquí, claro. Ahora supongamos que sólo nos interesan los registros de t1 que cumplen que su campo v es igual a valor:

SELECT *
FROM
t1 LEFT JOIN t2 ON t1.k=t2.k
WHERE t1.v='valor';

Mi pregunta es: ¿los SGBD hacen primero la composición y luego recurren al WHERE o desechan primero registros en las tablas para que la composición sea más pequeña? Porque si primero componen es más rápido:

SELECT *
FROM
(SELECT * FROM t1 WHERE t1.v='valor') t1 LEFT JOIN t2 ON t1.k=t2.k;

O sea, hacer una subselect.
  #2 (permalink)  
Antiguo 04/01/2010, 13:21
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, 5 meses
Puntos: 2658
Respuesta: Rendimiento de una consulta

Los algoritmos de planes de consulta tienen diferencias entre DBMS.
Además, la selección de una u otra forma de realizar la selección está afectada por estadísticas que los DBMS usan para verificar la eficiencia de una sobre otra de las técnicas. Así, puede darse que la misma consulta, con los mismos datos, se realice por métodos distintos en dos ejecuciones consecutivas. Esto es particularmente fácil de ver en los casos de estudio del Analizador de consultas de SQL Server.

MySQL, por ejemplo, puede usar métodos diferentes si se usa el ON o si se usa el USING en un INNER JOIN. O simplemente descartar las tablas si los valores necesarios están en un índice.
En cualquier caso, siempre es mejor que la vinculación por campos clave se realice a través de un JOIN (en cualquiera de sus variantes), por cuanto los DBMS usan el WHERE después de realizarlo y no antes.
El detalle fino de cómo selecciona uno u otro método lo debes consultar en los manuales de cada DBMS
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 05/01/2010, 03:27
 
Fecha de Ingreso: enero-2010
Mensajes: 2
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Rendimiento de una consulta

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En cualquier caso, siempre es mejor que la vinculación por campos clave se realice a través de un JOIN (en cualquiera de sus variantes), por cuanto los DBMS usan el WHERE después de realizarlo y no antes.
¿Esta segunda parte de la afirmación significa que es mejor que haga primero la subconsulta? (Entiendo que dices que el WHERE siempre resuelve después del JOIN)

En la base de datos que tengo (que no la he creado yo, sino otro programa y es una de esas infames hecha con access) la tabla t1 tiene del orden de 8000-9000 registros. En cambio, al filtrarla, los registros resultantes muy comúnmente son solamente 1 ó 2; raramente pasa de los 10.

Muchas gracias por tu respuesta.

Etiquetas: rendimiento
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 03:56.