Programming Languages Hacks

Importanti regole per linguaggi di programmazione rilevanti come Java, C, C++, C#…

  • Subscribe

  • Lettori

    I miei lettori abituali

  • Twitter

Performance in Left Join e Condizioni Multiple (COALESCE)

Posted by Ricibald on February 25th, 2014

A volte SQL Server produce degli execution plan, come dire… discutibili??

Un esempio è dato dall’operatore COALESCE e LEFT JOIN. Quando si lavora con tabelle molto grandi la query si traduce in un TableScan di milioni di righe laddove non previsto.

Esempio concreto:

SELECT *
    FROM BigTable X
    LEFT JOIN BigTable Y ON X.Id = COALESCE(Y.ParentId, Y.Id)
    WHERE X.Name = 'Something'

La query produce un execution plan che prevede un TableScan su una tabella di milioni di record. Il risultato sono minuti e minuti di attesa…

La stessa query potrebbe essere riscritta come segue per migliorare il risultato:

SELECT *
    FROM BigTable X
    LEFT JOIN BigTable Y ON 
        (Y.ParentId IS NOT NULL AND X.Id = Y.ParentId)      -- condizione 1
        OR
        (Y.ParentId IS NULL AND X.Id = Y.Id)                -- condizione 2
    WHERE X.Name = 'Something'

A volte questo workaround funziona, altre volte no. In questi casi sfortunati dovremmo scrivere la query come segue:

SELECT *
    FROM BigTable X                                         -- condizione 1
    JOIN BigTable Y ON Y.ParentId IS NOT NULL AND X.Id = Y.ParentId
    WHERE X.Name = 'Something'
UNION ALL
SELECT *
    FROM BigTable X                                         -- condizione 2
    JOIN BigTable Y ON Y.ParentId IS NULL AND X.Id = Y.Id
    WHERE X.Name = 'Something'
UNION ALL
SELECT X.*, Y1.*                                            -- no match
    FROM BigTable X
    LEFT JOIN BigTable Y1 ON Y.ParentId IS NOT NULL AND X.Id = Y1.ParentId
    LEFT JOIN BigTable Y2 ON Y.ParentId IS NULL AND X.Id = Y2.Id
    WHERE X.Name = 'Something' AND Y1.Id IS NULL AND Y2.Id IS NULL

Riscrivendo in questo modo (semplicissimo) la query avremo delle ottime performance. E meno male che dicono che SQL è un linguaggio dichiarativo…!!

Leave a Reply

You must be logged in to post a comment.