Qualche giorno fa, il mio collega Luca stava verificando come ottimizzare una query complessa per ottenere una riduzione dei tempi di esecuzione, e consultando vari help, ha effettuato una serie di test.
La clausola NOLOCK, aggiunta alle tabelle coinvolte nella query, velocizza notevolmente questo tipo di query. Leggendo i dati senza alcun tipo di blocco. E’ chiaro che non è sempre applicabile, perché il fatto di non bloccare e quindi leggere i dati “come sono” nel momento della query, può portare a incongruenze se la tabella è una tabella modificata molto velocemente. Ma in casi in cui la tabella non ha variazioni molto rapide, nell’ordine di secondi o meno, oppure dove una fotografia momento per momento è comunque significativa, questa clausola aiuta a diminuire notevolmente i tempi di esecuzione.
Ecco un esempio di query che usa la clausola:
SELECT au.[au_id] ,au.[au_lname] ,au.[au_fname] ,au.[phone] ,au.[address] ,au.[city] ,au.[state] ,au.[zip] ,au.[contract] ,ta.[au_ord] ,ta.[royaltyper] ,tt.[title] ,tt.[type] ,tt.[pub_id] ,tt.[price] ,tt.[advance] ,tt.[royalty] ,tt.[ytd_sales] ,tt.[notes] ,tt.[pubdate] FROM [pubs].[dbo].[authors] au (NOLOCK) Left outer join [pubs].[dbo].[titleauthor] ta (NOLOCK) ON au.au_id = ta.au_id Left outer join [pubs].[dbo].[titles] tt (NOLOCK) ON ta.title_id = tt.title_id order by au.au_id