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
