Come risolvere i problemi di blocco che sono causati da escalation dei blocchi in SQL Server

Traduzione articoli Traduzione articoli
Identificativo articolo: 323630 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Escalation blocchi Ŕ il processo di conversione molti blocchi specifiche (ad esempio i blocchi di riga o una pagina in blocchi di tabella. Microsoft SQL Server in modo dinamico determina quando eseguire l'escalation dei blocchi. Quando si effettua questa decisione, SQL Server tiene in considerazione il numero di blocchi che sono contenuti in un'analisi particolare, il numero di blocchi sono detenuti dall'intera transazione e la memoria viene utilizzata per i blocchi nel sistema come un intero. Comportamento predefinito di SQL Server determina in genere, escalation dei blocchi che si verificano solo in tali punti in cui Ŕ necessario migliorare le prestazioni o quando Ŕ necessario ridurre eccessiva memoria blocchi a un livello pi¨ ragionevole. Alcuni schemi di applicazione o query, tuttavia, potrebbero attivare escalation dei blocchi in un momento Ŕ preferibile non e il blocco di tabella escalated potrebbe impedire ad altri utenti. In questo articolo viene descritto come determinare se l'escalation dei blocchi Ŕ causata blocco e come gestire escalation dei blocchi indesiderati.

Informazioni

Come determinare se Escalation blocchi ╚ causata blocco

Escalation blocchi non comporta la maggior parte dei problemi di blocco. Per determinare se blocco escalation si sta verificando intorno alla ora quando si verificano problemi di blocco, avviare una traccia di SQL Profiler che include l'evento Lock: escalation . Se Ŕ non visualizzata gli eventi di blocco: escalation , escalation dei blocchi non avviene sul server e le informazioni contenute in questo articolo non sono applicabili alla situazione.

Se Ŕ in corso escalation dei blocchi, verificare che il blocco di tabella escalated blocca altri utenti.

Per ulteriori informazioni su come identificare il blocco di testina di stampa e come identificare la risorsa di blocco contenuta il blocco di testina di stampa che blocca altri processo server (SPID) ID, fare clic sul seguente numero dell'articolo per visualizzare l'articolo della Microsoft Knowledge Base:
224453 Comprensione e la risoluzione di SQL Server 7.0 o 2000 blocco problemi
Se il blocco che blocca altri utenti Ŕ diverso da un blocco di (a livello di tabella) TAB con una modalitÓ di blocco di S (condiviso) o X (esclusivo), escalation di blocco non Ŕ il problema. In particolare, se il blocco TAB Ŕ un blocco di tipo (ad esempio modalitÓ di blocco di IS, IU o IX), questo non Ŕ il risultato di escalation dei blocchi. Se i problemi di blocco non sono in causati da escalation dei blocchi, vedere l'articolo Q224453 per la risoluzione dei passaggi.

Come impedire l'escalation dei blocchi

La semplice e pi¨ sicuro per evitare l'escalation dei blocchi consiste per mantenere le transazioni brevi e per ridurre il footprint di blocco delle query costosa, in modo che non vengano superati i limiti di escalation dei blocchi. Esistono diversi modi per ottenere questo obiettivo, molti dei quali sono elencati:
  • Suddividere le operazioni di batch di grandi dimensioni in varie operazioni di dimensioni inferiori. Si supponga ad esempio, si esegue la query seguente per rimuovere pi¨ record precedente di 1000 100 da una tabella di controllo e quindi trovato che ha causato un'escalation di blocco bloccato ad altri utenti:
    DELETE FROM LogMessages WHERE LogDate < '2/1/2002'						
    per rimuovere questi record poche centinaia alla volta, Ŕ possibile ridurre notevolmente il numero di blocchi che si accumulano per transazione e impedire l'escalation dei blocchi. Ad esempio: delete_more
    SET ROWCOUNT 500
    delete_more:
         DELETE FROM LogMessages WHERE LogDate < '2/1/2002'
    IF @@ROWCOUNT > 0 GOTO delete_more
    SET ROWCOUNT 0
  • Ridurre il footprint di blocco della query rendendo efficiente possibile la query. Analisi di grandi dimensioni o i numeri grandi delle ricerche segnalibro possono aumentare le possibilitÓ di escalation dei blocchi; inoltre, aumenta la possibilitÓ di deadlock e influisce in genere influire negativamente sull'concorrenza e le prestazioni. Dopo aver individuato la query che causa l'escalation dei blocchi, cerca di individuare opportunitÓ per creare nuovi indici o per aggiungere colonne a un indice esistente per rimuovere le scansioni di indice o la tabella e ottimizzare l'efficienza di indice. Provare a incollare la query in una finestra di query Query Analyzer per eseguire un'analisi indice automatico su di esso. A tale scopo, dal menu query , fare clic su Ottimizzazione guidata indici in SQL Server 2000 oppure fare clic su Esegui analisi di indice in SQL Server 7.0.

    Un obiettivo di questa ottimizzazione Ŕ per rendere indice ricerche restituite righe minor numero possibile per ridurre al minimo il costo di ricerche di segnalibro ottimizzare la selettivitÓ di indice per la query particolare. Se SQL Server le stime che un operatore logico segnalibro ricerca pu˛ restituire il numero di righe, Ŕ possibile utilizzare un PRELETTURA per eseguire la ricerca segnalibro. Se SQL Server utilizza PRELETTURA per una ricerca di segnalibro, Ŕ necessario aumentare il livello di isolamento delle transazioni di una parte della query in lettura ripetibile per una parte della query. Ci˛ significa che cosa potrebbe simile a un'istruzione SELECT a livello di isolamento di lettura commit pu˛ acquisire molte migliaia di blocchi chiave (nell'indice cluster sia un indice non cluster), che possono causare una query di superare i limiti di escalation dei blocchi. Questo Ŕ particolarmente importante se si trova che il blocco escalated Ŕ un blocco tabella condivisa, che, tuttavia, non Ŕ comunemente visibile a livello di isolamento di lettura commit predefinito. Se una clausola di ricerca WITH PRELETTURA segnalibro causa l'escalation, si la consiglia di aggiungere ulteriori colonne e l'indice non cluster viene visualizzato nell'indice di ricerca o l'operatore logico scanner indice di sotto dell'operatore logico ricerca segnalibro nel piano di query. ╚ possibile creare un indice di accompagnamento (indice che include tutte le colonne in una tabella che sono stati utilizzati nella query) oppure ad almeno un indice che include le colonne che sono state utilizzate per i criteri di join o nella clausola WHERE se inclusi tutto l'elenco di selezione della colonna Ŕ poco.

    Un join ciclo nidificato pu˛ inoltre utilizzare PRELETTURA e in questo modo, lo stesso comportamento di blocco.

    Per informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
    260652 Join ciclo nidificato che utilizza un " Cerca BOOKMARK.. PRELETTURA .WITH " pu˛ contenere pi¨ blocchi
  • Escalation blocchi non pu˛ verificarsi se un SPID diversi Ŕ attualmente contenente un blocco di tabella non compatibile. Sempre escalation blocchi escalates per un blocco di tabella e non per blocchi di pagina. Inoltre, se un tentativo di escalation di blocco non riesce poichÚ SPID di un altro Ŕ responsabile un blocco TAB incompatibile, la query che tentativo di escalation non si blocca durante l'attesa di un blocco di tabulazione. Al contrario, continua acquisire blocchi al livello originale, maggiore riga, chiave o pagine, periodicamente effettua escalation ulteriori tentativi. Di conseguenza, un metodo per evitare l'escalation blocchi su una tabella specifica Ŕ per acquisire e per tenere un blocco su una connessione diversa non Ŕ compatibile con il tipo di blocco escalated. Un blocco di tipo esclusivo IX a livello di tabella non bloccare le righe o le pagine, ma Ŕ ancora non Ŕ compatibile con un S escalated (condiviso) o X blocco TAB (esclusivo). Si supponga, ad esempio, che Ŕ necessario eseguire un processo di batch che modifica un numero elevato di righe nella tabella mytable e che ha causato il blocco viene generato because of escalation dei blocchi. Se questo processo esegue sempre in meno di un'ora, Ŕ possibile creare un processo Transact-SQL che contiene il codice seguente e pianificare il processo di nuovo per avviare alcuni minuti prima ora di inizio del processo batch:
    BEGIN TRAN
    SELECT * FROM mytable (UPDLOCK, HOLDLOCK) WHERE 1=0
    WAITFOR DELAY '1:00:00'
    COMMIT TRAN				
    questa query consente di acquisire e contiene un blocco IX su mytable per un'ora, che impedisce di escalation dei blocchi sulla tabella durante tale periodo. Questo batch non modificano alcun dato o bloccare altre query (a meno che la query altri impone un blocco di tabella con l'hint TABLOCK o se un amministratore ha disabilitato blocchi di pagina o riga utilizzando un sp_indexoption stored procedure).
Inoltre, Ŕ possibile disattivare escalation dei blocchi, consentendo il flag di traccia 1211. Tuttavia, questo flag di traccia disattiva tutti i escalation di blocco a livello globale nell'istanza di SQL Server. Escalation blocchi ha uno scopo molto utile in SQL Server da aumentarne l'efficienza della query che in caso contrario rallentato verso il basso per l'overhead di acquisizione e rilascio diverse migliaia di blocchi. Bloccare escalation inoltre consente di ridurre la memoria necessaria per tenere traccia dei blocchi. La memoria di SQL Server possibile allocare dinamicamente per le strutture di blocco Ŕ limitata, se si disattiva escalation dei blocchi e la memoria blocchi aumenta sufficientemente grande, qualsiasi tentativo di allocare ulteriori blocchi per qualsiasi query potrebbe esito negativo e si verifica l'errore seguente:

Errore: 1204, gravitÓ: 19, stato: 1
Il server SQL Impossibile ottenere una risorsa LOCK in questo momento. Eseguire nuovamente l'istruzione quando esistono utenti attivi meno oppure chiedere all'amministratore di sistema per verificare la configurazione del blocco e la memoria di SQL Server.
Nota Quando si verifica un errore "1204" a capo, interrompe l'elaborazione dell'istruzione corrente e provoca un rollback della transazione attiva. Il ripristino potrebbe impedire agli utenti o causare un tempo di recupero database lungo se riavviare il servizio SQL Server.

Utilizzando un hint di blocco, ad esempio ROWLOCK modifica solo il piano di blocco iniziale. Gli hint di blocco non impedisce escalation dei blocchi.

Gli altri metodi di impedire l'escalation dei blocchi che sono illustrati in precedenza in questo articolo sono migliori opzioni di attivazione il flag di traccia. Inoltre, gli altri metodi in genere di causare prestazioni migliori per la query disattivazione escalation dei blocchi per l'istanza intera. Si consiglia di attivazione di questo flag di traccia solo per ridurre il blocco grave Ŕ causato da escalation dei blocchi durante altre opzioni, come tali trattati precedente in questo articolo, sono da esaminare. Per attivare un flag di traccia in modo che sia acceso ogni volta che SQL Server avvio, aggiungerlo come un parametro di avvio del server.

Per aggiungere un parametro di avvio del server, fare clic con il pulsante destro del mouse sul server in SQL Enterprise Manager, fare clic sul pulsante ProprietÓ , quindi nella scheda Generale , fare clic su parametri di avvio e aggiungervi il seguente parametro (esattamente come indicato):
-T1211
╚ necessario ciclo il servizio SQL Server per un nuovo parametro di avvio rendere effettive. Se si esegue la seguente query in Query Analyzer il flag di traccia ha effetto subito:
DBCC TRACEON (1211, -1)				
tuttavia, se non si aggiunge il -T1211 parametro di avvio, l'effetto di un comando traceon viene perduto quando il servizio SQL Server Ŕ cycled. Attivare il flag di traccia impedisce qualsiasi escalations blocco future, ma non annullare qualsiasi escalations blocco giÓ verificatisi in una transazione attiva.

ProprietÓ

Identificativo articolo: 323630 - Ultima modifica: giovedý 22 febbraio 2007 - Revisione: 10.3
Le informazioni in questo articolo si applicano a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Workgroup Edition
Chiavi:á
kbmt kbinfo KB323630 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica. Nel caso in cui si riscontrino degli errori e si desideri inviare dei suggerimenti, Ŕ possibile completare il questionario riportato alla fine del presente articolo.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 323630
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com