¿Tiene SQL una diferencia de rendimiento entre estas dos declaraciones?

SELECT distinct 'A' as TableName, Col1, Col2, Col3 FROM A 
UNION ALL 
SELECT distinct 'B' as TableName, Col1, Col2, Col3 from B

Versus

SELECT 'A' as TableName, Col1, Col2, Col3 FROM A 
UNION 
SELECT 'B' as TableName, Col1, Col2, Col3 from B

La diferencia entre esta y otras preguntas similares, como UNION vs DISTINCT en el rendimiento es que puedo confirme de antemano que las tablas individuales que estoy usando no tendrán registros duplicados entre , solo dentro de las tablas individuales.

Los planes de ejecución me parecen iguales, ya que ordena las tablas individuales antes de concatenarlas. Sin embargo, si elimino el escalar de ambos, el plan de UNION ALL permanece básicamente igual, pero UNION cambia a concatenación antes que el distinto. Concatenaré unas 20 tablas juntas, y no está claro si hacer 20 DISTINCT individuales es más rápido que hacer un DISTINCT grande al final, ya que aún puedo confirmar que las tablas no compartirían ningún duplicado entre ellas (solo dentro de la misma mesa).

2
ChristopherBass 29 ene. 2016 a las 22:59

2 respuestas

La mejor respuesta

DISTINCT no se implementa necesariamente por orden, también se puede implementar mediante hash.

Ambas son operaciones que consumen memoria y la reducción del tamaño de los datos que se diferencian puede ayudar a reducir la cantidad de memoria requerida, lo que es bueno para la concurrencia.

La complejidad algorítmica de la clasificación es n log n, lo que significa que el trabajo requerido crece linealmente a medida que crece n. Sobre esa base, ordenar 10 conjuntos más pequeños de tamaño s debería ser generalmente más rápido que clasificar un conjunto más grande de tamaño 10*s.

2
Martin Smith 29 ene. 2016 a las 20:48

No hablemos de SQL por un minuto.

Caso 1 : digamos, hay una lista de 100 números.

List: 1,2,3,4,....60 and then 61 repeats 40 times.

La lista no está ordenada y no lo sabe de antemano. Ahora está intentando buscar los valores únicos de la lista de 100 números y luego ordenarlos.

Caso 2 : como dijiste, hay dos listas sin registros duplicados entre ellas.

List 1: 1,2,3,4,....60
List 2: 61,61,61,61... 40 times

Satisface la condición que mencionaste. La lista uno, de manera similar, tiene los números en orden aleatorio. Pero ahora está buscando los valores únicos, de la lista de 60 y no de un conjunto más grande de 100 números y otra lista de la que obtendrá 61.

Al llegar a SQL , todo depende del tamaño de los datos que tenga en cada tabla individual y pueden ser otros factores.

Acepto que no es una respuesta completa, aún espero que esto ayude.

0
Deepanshu Kalra 29 ene. 2016 a las 20:17