Abbiamo molte "stored procedure di ricerca" che utilizzano più parametri Null per la ricerca di righe di dati in tabelle diverse. Sono di solito costruiti in questo modo:T-SQL - Viene utilizzato un piano non ottimale - la clausola WHERE deve essere cortocircuitata
SELECT *
FROM Table1 T1
INNER JOIN Table2 T2
ON T2.something = T1.something
WHERE (@parameter1 IS NULL OR T1.Column1 = @parameter1)
AND (@parameter2 IS NULL OR T2.Column2 = @parameter2)
AND (@parameter3 IS NULL OR T1.Column3 LIKE '%' + @parameter3 + '%')
AND (@parameter4 IS NULL OR T2.Column4 LIKE '%' + @parameter4 + '%')
AND (@parameter5 IS NULL OR T1.Column5 = @parameter5)
Questo può andare avanti per un massimo di 30-40 parametri e quello che abbiamo notato è, anche se è previsto solo parametro1, il piano di esecuzione passa attraverso scansioni indice dell'altra tabelle che possono rallentare significativamente la query (pochi secondi). I test ci mostrano che mantenere solo la prima riga dall'istruzione WHERE rende istantanea la query.
ho letto che shortcuiting non è possibile, ma sono là aggirare o modi di costruire le query che sarebbe forse essere più efficace?
Attualmente aggiriamo questo problema avendo versioni diverse dello stesso SELECT/FROM/JOINS ma con diversi set di parametri nella clausola WHERE e in base a quali parametri vengono passati, scegliamo la corretta istruzione select da seguire. Questo è lungo, disordinato e difficile da mantenere.
Avete considerato l'utilizzo di [SQL dinamico] (http://www.sommarskog.se/dynamic_sql.html)? Anche con l'avvertenza [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) potrebbe essere più adatto alle tue esigenze. – Oded
La conversione dinamica parametrizzata di sql e sql non è un problema – StrayCatDBA
Daremo un'occhiata di nuovo a SQL dinamico, ma sembra tornare a come eravamo soliti fare e costruire complesse stringhe di codice SQL all'interno delle applicazioni stesse con una serie di condizioni che rendevano quasi impossibile comprendere la query a una rapida occhiata. C'è anche un modo per mantenere l'evidenziazione della sintassi/gli strumenti all'interno di SQL Management Studio per quelle query? – FrancoisCN