2009-11-18 21 views
5

Ho una semplice query come questaPerché questa istruzione SELECT si blocca su SQL Server?

SELECT * FROM MY_TABLE; 

quando l'eseguo, SQL Server Management Studio si blocca.

Altre tabelle e viste funzionano correttamente.

Cosa può causare questo? Ho avuto serrature durante l'esecuzione di istruzioni UPDATE prima, e so come avvicinarsi a quelle. Ma cosa potrebbe causare il blocco di SELECT?

Ho eseguito il rapporto "Tutte le transazioni di blocco" e dice che non ce ne sono.

risposta

10

Probabilmente non è il prescelto che blocca su, ma qualche altro processo che sta modificando (/ delete/insert udpate) la tabella che sta causando le serrature.

È possibile visualizzare quale processo sta bloccando eseguendo exec sp_who2 sul server SQL.

In alternativa, se siete OK con letture sporche, si può fare una delle due cose

SELECT * FROM Table WITH (NOLOCK) 

O

SET Transaction Isolation Level Read Uncommitted 
SELECT * FROM Table 
+0

exec sp_who2 mi ha dato un ALTER INDEX che è in corso. Sembra essere il colpevole. Grazie. – JosephStyons

3

Utilizzare questa:

SELECT * FROM MY_TABLE with (NOLOCK) 
+0

Funziona, ma come posso sapere chi/cosa sta causando il blocco? – JosephStyons

+0

Vedere risposta da BradC: Alcuni altri processi hanno un blocco sul tavolo, impedendo la selezione da parte fino a quando non viene rilasciato quel blocco – Mikhail

1

due possibilità:

  1. Il suo un tavolo davvero massiccia e stai cercando di restituire 500 m righe.
  2. Alcuni altri processi hanno un blocco sul tavolo, impedendo alla selezione di passare fino a quando il blocco non viene rilasciato.
+0

No al # 1. Sì al 2 ma chi/cosa? – JosephStyons

+0

@BradC in # 1 è 500m significa 500 milioni, o è qualcos'altro. – robert

+0

@robert, si intendevo 500 milioni, o qualche altro numero assurdamente alto. – BradC

3

Se ci sono molte altre attività in corso, qualcos'altro potrebbe causare blocchi e SELECT potrebbe essere la vittima del deadlock. se si esegue il seguente

SELECT * FROM my_table WITH(nolock) 

stai dicendo la banca dati che stai bene a leggere i dati sporchi (uncomitted), e che i blocchi causati da altre attività può essere ignorato.

Inoltre, se una query del genere provoca Management Studio per appendere, la vostra tabella potrebbe usare un po 'di ottimizzazione

1

MY_TABLE potrebbe essere bloccato anche da qualche transazione senza commit - vale a dire/stored procedure script in esecuzione (o falliti durante l'esecuzione) in un'altra finestra MSMM.

Problemi correlati