2011-06-30 13 views
7

Tengo una consulta sql con muy mal rendimiento. Lo rastreé hasta el INNER JOIN realizado en la mesa. El cambio de este a izquierda unirse aumenta significativamente el rendimiento (de 6 min 20 seg) - ahora sé que el 2 no están equiv, pero ... aquí es lo que estoy pidiendoSQL interno vs pregunta de combinación izquierda

SELECT * 
    FROM SomeTable ST 
    JOIN BigTable BT ON BT.SomeID = ST.SomeID 
        AND BT.Something = ST.Something 
        AND BT.AnotherValue = '123' 

Dado que la unión tiene criterios adicionales (y algo = algo) - está cambiando esto a una combinación izquierda produciendo los mismos resultados - ¿pero MUCHO más rápido?

Los resultados devueltos son los mismos utilizando IZQUIERDA/interior con izquierda siendo significativamente más rápido ...

+0

Esto es extraño, ya que en la mayoría de los casos 'INNER JOIN' tiene mejor rendimiento. Un 'OUTER JOIN' debe devolver filas incluso cuando no coincida. ¿Estás seguro de que no hay más en esto que el tipo de unión? – Yuck

+0

YUP, estoy confundido como siempre - las lecturas lógicas se reducen en millones (muchos millones) – user822150

+0

¿puede publicar planes de ejecución para ambos? – Thilo

Respuesta

2

Parece que hacer la unión interna al revés daría un mejor rendimiento ...

SELECT 
    * 
FROM 
    BigTable AS BT 
INNER JOIN 
    SomeTable AS ST 
ON 
    BT.AnotherValue = '123' 
AND 
    BT.SomeID = ST.SomeID 
AND 
    BT.Something = ST.Something 

o con subconsulta

SELECT 
    * 
FROM 
    (SELECT * FROM BigTable WHERE AnotherValue = '123') AS BT 
INNER JOIN 
    SomeTable AS ST 
AND 
    BT.SomeID = ST.SomeID 
AND 
    BT.Something = ST.Something 

también, asegúrese de que el BigTable.AnotherValue se indexa correctamente.

0

Mientras obtiene los mismos resultados de ambas uniones, es importante entender que una combinación de la izquierda es diferente de una unión interna.

Una combinación izquierda se llevará a todas las filas de la tabla izquierda incluso si no hay partidos en la tabla de la derecha.

SQL LEFT JOIN vs SQL INNER JOIN

lo que sus datos sólo pasa a ser producido de una manera que es idéntica dado los dos diferentes uniones.

SELECT * 
    FROM SomeTable ST 
    JOIN BigTable BT ON BT.SomeID = ST.SomeID 
        AND BT.Something = ST.Something 
        AND BT.AnotherValue = '123' 

¿Qué tal esto:

SELECT 
    * 
FROM 
    SomeTable 
     INNER JOIN 
    BigTable 
     ON SomeTable.PreferedPrimaryKey = BigTable.PreferAForeignKey 
     AND SomeTable.SomethingThatIsIndexedAndPreferableNumeric = BigTable.SomethingThatIsIndexedAndPreferableNumeric 
WHERE 
    BigTable.AnotherValue = '123' 

Compruebe sus índices y asegurarse de que sus criterios para la segunda parte de la unión no es una cadena de caracteres no indexada.

+1

No usa w3schools como fuente confiable. Nunca. Eso es lo que me dijeron. – user194076

+0

No sé dónde oíste esto sobre w3schools, pero las combinaciones sql han existido durante décadas y se han implementado en varias bases de datos. Probablemente lo entendieron bien. – JeffO

+0

Correcto. Eso es realmente todo lo que importa. –

Cuestiones relacionadas