Press "Enter" to skip to content

La clausola NOLOCK su una SELECT per velocizzare una query

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