Domanda

Sfondo:. Ho una performance-critical di query mi piacerebbe correre e non mi importa di letture sporche

La mia domanda è; Se sto usando unisce, devo specificare l'hint NOLOCK su quelli come bene?

Per esempio; è:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID

Equivalente a:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID

O avrò bisogno di specificare il suggerimento (NOLOCK) sul unirsi al fine di garantire non sto bloccare la tabella unita?

È stato utile?

Soluzione

Non voglio affrontare l'argomento READ UNCOMMITTED, solo la tua domanda iniziale.

Sì, è necessario WITH(NOLOCK) su ogni tavolo del join. No, le query non sono gli stessi.

Prova questo esercizio. Iniziare una transazione e inserire una riga nella tabella 1 e table2. Non commettere o rollback della transazione ancora. A questo punto la prima query restituirà con successo e includere le righe non impegnati; la vostra seconda query non tornerà perché table2 non ha il suggerimento WITH(NOLOCK) su di esso.

Altri suggerimenti

ero abbastanza sicuro che è necessario specificare il NOLOCK per ogni JOIN nella query. Ma la mia esperienza è stata limitata a SQL Server 2005.

Quando alzai gli occhi MSDN solo per confermare, non riuscivo a trovare nulla di preciso. Il sotto affermazioni sembrano farmi pensare, che per il 2008, le tue due affermazioni di cui sopra sono equivalenti se per il 2005 non è il caso:

  

[SQL Server 2008 R2]

     

Tutti gli hint di blocco vengono propagate a tutti i tavoli e le viste che sono a cui si accede dal piano di query , incluse le tabelle e viste riferimento in una vista. Inoltre, SQL Server esegue i controlli corrispondenti coerenza di blocco.

     

[SQL Server 2005]

     

In SQL Server 2005, tutti i suggerimenti di blocco vengono propagati a tutti i tavoli e le viste cui si fa riferimento in una vista. Inoltre, SQL Server esegue i controlli corrispondenti coerenza di blocco.

In aggiunta, scegliere nota - e questo vale sia per il 2005 e il 2008:

  

I suggerimenti di tabella vengono ignorati se la tabella non si accede dal piano di query. Ciò può essere causato dal ottimizzatore scegliendo di non accesso tavola a tutti, o perché una vista indicizzata si accede invece. In quest'ultimo caso, l'accesso una vista indicizzata può essere evitato utilizzando per la query OPTION (EXPAND VIEWS).

Nessuno dei due. È possibile impostare il livello di isolamento a READ UNCOMMITTED che è sempre meglio che dare serratura individuale suggerimenti. O, meglio ancora, se vi preoccupate per dettagli come consistenza , uso l'isolamento dello snapshot .

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