SQL, ottimizzazioni, numeri random e curiosità
SQL Server nasconde sempre qualche scoperta interessante: oggi è stata la volta di alcune SELECT che risultano più ottimizzate scrivendo una sintassi controintuitiva: in alcuni casi è meglio fare una LEFT JOIN con una tabella e mettere una WHERE tabellajoin.campo IS NOT NULL piuttosto che fare una WHERE NOT EXISTS (SELECT * FROM tabella WHERE stessa condizione join). Attenzione, non è sempre così, ma in alcuni scenari la differenza è molto grande (quasi un ordine di grandezza). Si tratta di un fenomeno che avevo già descritto in un post precedente su qualcosa di analogo.
Come al solito, misurate sempre prima di prendere una decisione. SET STATISTICS IO ON e SET STATISTICS PROFILE ON sono due strumenti indispensabili per trovare i colli di bottiglia delle vostre query.
Uno dei motivi per cui sono arrivato a valutare queste diverse ottimizzazioni è il fatto che avevo avuto problemi prestazionali nell'uso di una UDF (user defined function). Le UDF sono valutate per ogni riga esaminata, anche se la funzione non ha parametri ed è deterministica (e dovrebbe quini restituire sempre lo stesso valore). In realtà stasera ho scoperto quasi per caso che non è così (non è detto che una funzione deterministica sia veramente tale): se ne parla in questo post di Jeff Smith dove viene spiegato come generare dei numeri random diversi per ogni riga del risultato di una SELECT. Leggete anche i feedback perché c'è una soluzione alternativa basata a quella descritta nel post che in alcuni casi può essere comoda. Il non-determinismo è dato dal fatto che SQL Server consente di creare una UDF contenente all'interno una SELECT su una vista... che a sua volta può fare una SELECT con una funzione RAND (che non è deterministica): aggirato l'ostacolo, ecco che la nostra UDF diventa non deterministica e restituisce un valore diverso per ogni chiamata. Comodo per avere i numeri random, ma da maneggiare con cautela per le implicazioni che può avere in altri scenari!
Infine, la curiosità: leggendo altri post dello stesso autore ho trovato questo che parla di indici: niente di nuovo, ma il post parte come commento a un posto su questo sito: TheDailyWTF. Se non sapete cosa vuol dire l'acronimo WTF cercate su Google... Il bello del sito è che raccoglie aneddoti comprensibili solo a un programmatore (per la maggior parte, almeno).
Oggi due feed RSS in più sul mio SharpReader.