KB2926217 - FIX: si verificano problemi di prestazioni quando l'attività di blocco del database aumenta in SQL Server

Si applica a
SQL Server 2012 Enterprise SQL Server 2012 Developer SQL Server 2012 Standard SQL Server 2012 Express SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2008 Service Pack 3 SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2008 R2 Service Pack 2 SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard

Per impostazione predefinita, i Service Pack 1 per SQL Server 2014 e il Service Pack 3 per SQL Server 2012 includono questa correzione e non è necessario aggiungere flag di traccia per abilitare la correzione. Per abilitare la correzione dopo aver installato uno degli aggiornamenti cumulativi nella sezione Risoluzione, è necessario avviare Microsoft SQL Server aggiungendo il flag di traccia 1236 ai parametri di avvio.

Sintomi

Si supponga di eseguire un'istanza di Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 o SQL Server 2008 R2 in un computer contenente molti processori. Quando il numero di blocchi (tipo di risorsa = DATABASE) per un database specifico supera una determinata soglia, si verificano i problemi di prestazioni seguenti:

  • Valori elevati si verificano per LOCK_HASH numero di spinlock.

    Nota: vedere la sezione "Ulteriori informazioni" per informazioni su come monitorare questo spinlock.

  • Il completamento delle query o delle operazioni che richiedono blocchi di database richiede molto tempo. Ad esempio, è possibile notare i seguenti rallentamenti delle prestazioni:

    • Account di accesso a SQL Server
    • Query su server collegati
    • sp_reset_connection
    • Transazioni

Nota Per individuare l'elenco dei blocchi (tipo di risorsa = DATABASE) in un determinato database, vedere la sezione "Altre informazioni". Il valore soglia varia in base all'ambiente.

Risoluzione

Informazioni sull'aggiornamento cumulativo

Il problema è stato risolto per la prima volta nell'aggiornamento cumulativo seguente di SQL Server.

Aggiornamento cumulativo 13 per SQL Server 2008 R2 SP2 /it-it/help/2967540

Aggiornamento cumulativo 17 per SQL Server 2008 SP3 /it-it/help/2958696

Aggiornamento cumulativo 1 per SQL Server 2014 /it-it/help/2931693

Aggiornamento cumulativo 9 per SQL Server 2012 SP1 /it-it/help/2931078

Informazioni sugli aggiornamenti cumulativi per SQL Server

Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutte le correzioni rapide e di sicurezza incluse nell'aggiornamento cumulativo precedente. Vedere gli aggiornamenti cumulativi più recenti per SQL Server:

      

Informazioni sull'aggiornamento rapido (hotfix)
 Un aggiornamento rapido supportato è disponibile da Microsoft. Tuttavia, questo aggiornamento rapido (hotfix) ha lo scopo di correggere solo il problema descritto in questo articolo. Applica questo aggiornamento rapido (hotfix) solo ai sistemi in cui si verifica questo problema specifico.

Se l'hotfix è disponibile per il download, c'è una sezione "Download di hotfix disponibile" all'inizio di questo articolo della Knowledge Base. Se questa sezione non viene visualizzata, inviare una richiesta al servizio clienti e supporto tecnico Microsoft per ottenere l'aggiornamento rapido (hotfix).

Nota: se si verificano altri problemi o se è necessaria una risoluzione dei problemi, potrebbe essere necessario creare una richiesta di assistenza separata. I normali costi di supporto verranno applicati alle domande di supporto aggiuntive e ai problemi che non sono idonei per questo aggiornamento rapido specifico. Per un elenco completo dei numeri di telefono del servizio clienti e del supporto tecnico Microsoft o per creare una richiesta di servizio separata, visita il seguente sito Web Microsoft:

/contactus/?ws=support Nota: nel modulo "Download dell'aggiornamento rapido disponibile" vengono visualizzate le lingue per cui è disponibile l'aggiornamento rapido (hotfix). Se la lingua non è visualizzata, è perché non è disponibile un aggiornamento rapido (hotfix).

Stato

Microsoft ha confermato che si tratta di un problema relativo ai prodotti elencati nella sezione "Si applica a".

Altre informazioni

Quando un'applicazione stabilisce una connessione a SQL Server, stabilisce innanzitutto un contesto di database. Per impostazione predefinita, la connessione tenterà di ottenere un blocco DATABASE in modalità SH. Il blocco SH-DATABASE verrà rilasciato quando la connessione viene interrotta o il contesto del database viene modificato durante la durata della connessione. Se sono presenti molte connessioni attive che utilizzano lo stesso contesto di database, è possibile che siano presenti molti blocchi del tipo di risorsa DATABASE per il database specifico.

Nel computer con 16 o più CPU, solo gli oggetti tabella usano uno schema di blocco partizionato. Tuttavia, i blocchi del database non sono partizionati. Di conseguenza, maggiore è il numero di blocchi del database, maggiore sarà il tempo necessario a SQL Server per ottenere un blocco sul database. La maggior parte delle applicazioni non riscontra problemi causati da questa progettazione. Ma non appena il numero supera una certa soglia, sono necessari ulteriore lavoro e tempo per ottenere il blocco. Sebbene il costo sia di soli microsecondi per ogni blocco aggiuntivo, il tempo totale può aumentare rapidamente perché i bucket hash di blocco sono protetti tramite uno spinlock. Ciò causa cicli di CPU aggiuntivi e attende ulteriori lavori per ottenere il blocco.

Questo aggiornamento rapido introduce il partizionamento dei blocchi DATABASE quando il flag di traccia T1236 è abilitato all'avvio. Il partizionamento del blocco DATABASE mantiene gestibile la profondità dell'elenco di blocchi in ogni partizione locale. In questo modo viene ottimizzato in modo significativo il percorso di accesso usato per ottenere un blocco DATABASE.

Per monitorare il LOCK_HASH spinlock, è possibile usare la query seguente. IMPOSTARE NOCOUNT SU
CREATE TABLE #spinlock_stats([CaptureTime], datetime,[name], nvarchar(512),[collisions], bigint,
[gira] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
MENTRE @counter< 100
      BEGIN
            INSERISCI IN #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
            WAITFOR DELAY '00:00:05'
            SET @counter +=1
      FINE
SELEZIONA * DA #spinlock_stats ORDINA PER [CaptureTime]
DROP TABLE #spinlock_stats Per altre informazioni sulla diagnosi e la risoluzione della contesa di spinlock in SQL Server, vedere il documento seguente:

Diagnosi e risoluzione della contesa di spinlock in SQL Server Nota Sebbene questo documento sia scritto per SQL Server 2008 R2, le informazioni sono ancora applicabili a SQL Server 2012.

Riferimenti

Per ulteriori informazioni sui flag di traccia in SQL Server 2012, visitare il seguente sito Web TechNet:

Informazioni sui flag di traccia in SQL Server 2012
Per altre informazioni su come trovare il numero di blocchi di database nell'utente per database, usare la query seguente per calcolare questo valore:select Resource_database_id, resource_type, request_mode, request_status,
conteggio (*) 'LockCount' da sys.dm_tran_locks
Raggruppare per Resource_database_id, resource_type, request_mode request_status