2010-05-21 26 views
5

Tengo una tabla de transacción histórica grande (15-20 millones de filas MUCHAS columnas) y una tabla con una fila una columna. La tabla con una fila contiene una fecha (última fecha de procesamiento) que se usará para extraer los datos en la tabla de transacciones ('process_date').Pregunta de pregunta de consulta SQL

Pregunta: ¿Debo unirme internamente la tabla 'process_date' a la tabla de transacciones o la tabla de transacciones a la tabla 'process_date'?

+2

estaría muy sorprendido si que daría lugar a diferentes planes de ejecución. –

+2

Acabo de verificar con dos de nuestras tablas. Devuelve exactamente el mismo plan de ejecución. Para responder a tu pregunta, no importa. –

+0

¿El plan de ejecución tiene una correlación directa con la eficiencia? Es decir, si 2 planes son exactamente iguales ¿el tiempo de ejecución es exactamente el mismo? – Keng

Respuesta

6

Esta es la forma en que lo haría

SELECT <<list only columns you need>> 
FROM large_historical_transaction_table t 
WHERE EXISTS (SELECT 1 FROM OneRowTable o 
       WHERE o.last_processing_date = t.process_date) 
+0

Estoy seguro de que sabes de lo que estás hablando, con un nombre como SQLMenace y un representante de 17k, pero a primera vista, parece que la subconsulta correlacionada se ejecutará para cada fila en la tabla grande. – mdma

+0

+1, @mdma, se ve de esa manera, pero esto es más rápido que la unión normal –

+0

Gracias por aclarar. Estoy interesado en conocer los detalles de cómo es más rápido. ¿Conocen los enlaces que describen esto con más detalle? – mdma

2

combinación interna es una relación simétrica bidireccional, en general, no importa, pero en este caso yo sugeriría que no se incorporan en absoluto, leer la fecha del umbral en una variable y pasarla a la otra consulta de selección como parámetro ...

2

Para la legibilidad me gustaría unirme internamente de la tabla de transacciones para indicar explícitamente que la segunda tabla con la fecha simplemente actúa como un filtro .

2

Al unir las tablas, el optimizador de consultas toma una rápida detección de ambas para determinar la implementación de combinación más adecuada. Lógicamente, la unión interna es simétrica, pero la implementación puede favorecer a un lado sobre el otro para un mejor rendimiento.

-2

transversal A unen lo hará:

SELECT t.col1, t.col2, p.process_date 
FROM Transactions t, Process p; 
+1

No, no lo haría. Devolvería ** todos ** registros de Transacciones. Eso no es lo que quiere OP. –

+1

Ah, lo perdí. En ese caso, es solo una unión interna. Gracias por la corrección. – sqlvogel

+0

Si cambias tu respuesta, puedo hacer algo al respecto -1. – Keng