Domanda

Immagino che la vera domanda sia:

Se non mi interessano le letture sporche, l'aggiunta del suggerimento con (NOLOCK) a un'istruzione SELECT influirà sulle prestazioni di:

  1. l'attuale istruzione SELECT
  2. altre transazioni sulla tabella indicata

Esempio:

Select * 
from aTable with (NOLOCK)
È stato utile?

Soluzione

1) , una selezione con NOLOCK verrà completata più rapidamente di una selezione normale.

2) , una selezione con NOLOCK consentirà ad altre query sulla tabella effettuata di completarsi più velocemente di una selezione normale.

Perché dovrebbe essere?

NOLOCK in genere (a seconda del tuo motore DB) significa che mi dai i tuoi dati, e non mi interessa in che stato si trovano, e non mi preoccupo di tenerli fermi mentre leggi da esso . È tutto in una volta più veloce, meno dispendioso in termini di risorse e molto molto pericoloso.

Dovresti essere avvisato di non fare mai un aggiornamento o eseguire qualsiasi cosa di sistema critica, o dove è richiesta la correttezza assoluta usando i dati che hanno avuto origine da una lettura NOLOCK . È assolutamente possibile che questi dati contengano righe che sono state eliminate durante l'esecuzione della query o che sono state eliminate in altre sessioni che devono ancora essere finalizzate. È possibile che questi dati includano righe che sono state parzialmente aggiornate. È possibile che questi dati contengano record che violano i vincoli di chiave esterna. È possibile che questi dati escludano le righe che sono state aggiunte alla tabella ma che devono ancora essere impegnate.

Non hai davvero modo di sapere quale sia lo stato dei dati.

Se stai cercando di ottenere cose come un conteggio delle righe o altri dati di riepilogo in cui un margine di errore è accettabile, allora NOLOCK è un buon modo per migliorare le prestazioni di queste query ed evitare di averle influisce negativamente sulle prestazioni del database.

Usa sempre il suggerimento NOLOCK con grande cautela e tratta tutti i dati che restituisce in modo sospetto.

Altri suggerimenti

NOLOCK rende la maggior parte delle istruzioni SELECT più veloci, a causa della mancanza di blocchi condivisi. Inoltre, la mancanza di rilascio dei blocchi significa che il tuo SELECT non sarà impedito agli scrittori.

NOLOCK è funzionalmente equivalente a un livello di isolamento di READ UNCOMMITTED. La differenza principale è che puoi usare NOLOCK su alcuni tavoli ma non su altri, se lo desideri. Se si prevede di utilizzare NOLOCK su tutte le tabelle in una query complessa, utilizzare SET LEVEL ISOLATION TRANSATION READ UNCOMMITTED è più semplice, poiché non è necessario applicare il suggerimento a ogni tabella.

Ecco le informazioni su tutti i livelli di isolamento a tua disposizione, così come i suggerimenti sulla tabella.

IMPOSTA LIVELLO ISOLAMENTO TRANSAZIONE

Suggerimento tabella (Transact-SQL)

Oltre a quanto detto sopra, dovresti essere molto consapevole del fatto che nolock in realtà impone il rischio che non riceva le righe che sono state impegnate prima della tua selezione.

Vedi http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx

Sarà più veloce perché non deve attendere i blocchi

  • L'attuale SELECT inizierà prima, perché non deve aspettare.

  • Le altre transazioni rallenteranno poiché ora condividono il tempo di elaborazione con una nuova transazione.

Non usarlo.

NOLOCK è spesso sfruttato come un modo magico per accelerare le letture del database, ma cerco di evitare di usarlo il più possibile.

Il set di risultati può contenere righe non ancora impegnate, che spesso vengono successivamente ripristinate.

Un errore o un set di risultati può essere vuoto, mancare righe o visualizzare la stessa riga più volte.

Questo perché altre transazioni stanno spostando i dati mentre li stai leggendo.

LEGGI IMPEGNATO aggiunge un ulteriore problema in cui i dati sono danneggiati all'interno di una singola colonna in cui più utenti cambiano la stessa cella contemporaneamente.

Ci sono anche altri effetti collaterali, che si traducono nel sacrificare l'aumento di velocità che speravi di ottenere in primo luogo.

Ora sai, non usarlo mai più.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top