Blocco di compilazione eccessivo su sp_procedure_params_90_rowset


14

Una rinascita di questa domanda su MSDN: Block--process-report: cos'è questa waitresource "OBJECT: 32767: 124607697: 0 [COMPILE]"

Ho preso queste dichiarazioni in Profiler. Tutti hanno una durata superiore a 3 secondi. Alcuni oltre 10+. L'attività di blocco è la stessa del collegamento da MSDN .

Le chiamate utilizzano tutte una denominazione in 3 parti. Tutti specificano un proc diverso nella forma che assomigliano al seguente:

exec [db1].[sys].sp_procedure_params_90_rowset N'proc1', 1, NULL, NULL
exec [db2].[sys].sp_procedure_params_90_rowset N'proc2', 1, NULL, NULL
exec [db3].[sys].sp_procedure_params_90_rowset N'proc3', 1, NULL, NULL
exec [db4].[sys].sp_procedure_params_90_rowset N'proc4', 1, NULL, NULL

Cosa posso fare per ridurre questo livello di blocco?

(modifica) Ora sto vedendo la stessa cosa per:

exec [db1].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db2].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db3].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db4].[sys].sp_primary_keys_rowset N'view1', N'dbo'

Sta succedendo qualcosa di sistemico ma non so cos'altro fare. il chiamante è VB6 tramite ADO. È ADO che fa queste chiamate.

Di seguito è riportato un esempio di processo bloccato

 <blocked-process-report>
    <blocked-process>
        <process
            id="process5bc1288"
            taskpriority="0"
            logused="0"
            waitresource="OBJECT: 32767:124607697:0 [COMPILE]"
            waittime="28887"
            ownerId="11638114050"
            transactionname="sqlsource_transform">
            <executionStack>
                <frame
                    line="1"
                    sqlhandle="0x000000000000000000000000000000000000000000000000">
                    <sqltext>EXEC [dbo].[spAlertDetectByPoll] ':V:^RMAlert^:Z:^&amp;N&amp;#RMAlert#&amp;S&amp;#L#&amp;UID&amp;#19#&amp;AGN&amp;#1#&amp;DFC&amp;#103#^', 1</sqltext>
                </frame>
            </executionStack>
            <inputbuf>
SET NO_BROWSETABLE OFF   </inputbuf>
        </process>
    </blocked-process>
    <blocking-process>
        <process
            status="suspended"
            waitresource="OBJECT: 32767:124607697:0 [COMPILE]"
            waittime="35693"
            spid="1121"
            sbid="0"
            ecid="0"
            priority="0"
            trancount="0"
            lastbatchstarted="2013-12-16T14:45:48.960">
            <executionStack>
                <frame
                    line="1"
                    sqlhandle="0x000000000000000000000000000000000000000000000000" />
            </executionStack>
            <inputbuf>
SET NO_BROWSETABLE OFF   </inputbuf>
        </process>
    </blocking-process>
</blocked-process-report>

Sono installati il ​​service pack e gli aggiornamenti cumulativi più recenti per SQL Server 2008 R2?
Max Vernon,

SP2 CU4 Microsoft SQL Server 2008 R2 (SP2) - 10.50.4270.0 (X64)
dan holmes

Quando è iniziato questo? Di recente hai applicato il Service Pack o l'aggiornamento cumulativo? Sto anche supportando VB6 / ADO e ricordo di aver visto questi proc di sistema una o due volte, ma non credo che ci fosse un problema di blocco. Penso che siano venuti fuori perché sono chiamati così frequentemente. Prego che questo non sia legato a SP / CU perché siamo ancora al 10.50.2500 e sarebbe morte se queste cose iniziassero prendendo 3-10 secondi ciascuna.
Jon Seigel,

ha inserito uno dei tanti in pastbin pastebin.com/4wUgzby9 . questo è andato avanti per circa 2 o 3 settimane. Non applichiamo una CU da molto tempo. È accaduto all'inizio del 2012 la prima volta datato dalla posta MSDN.
dan holmes,

1
questo potrebbe essere solo il sintomo. Ho un'attesa regolare di attesa su RESOURCE_SEMAPHORE_QUERY_COMPILE. Ecco il miglior trattamento di questo waittype che ho trovato: blogs.msdn.com/b/support_sql_france/archive/2012/02/07/…
dan holmes

Risposte:


2

C'è un eccellente post sul blog http://blogs.msdn.com/b/support_sql_france/archive/2012/02/07/sql-server-compilation-gateways-and-resource-semaphore-query-compile.aspx che spiega cosa c'è accadendo.

SQL Server consente un determinato numero di compilation in base alla loro complessità. Li raggruppa in piccoli, medi e grandi. Per le compilation di grandi dimensioni, può essercene solo una compilata alla volta, quindi supponiamo che tutti i tuoi processi siano considerati grandi, quindi ognuno deve essere compilato in serie. Ciò potrebbe spiegare il blocco.
Penso che potrebbero esserci diversi approcci al problema: considerare più risorse (più CPU consentiranno la simultanea di query più piccole e medie o potrebbe aumentare la soglia per ciò che è considerato medio). Inoltre, più memoria può risolvere il problema.

Se sei come la maggior parte di noi, potrebbe non essere possibile. Un'altra opzione potrebbe essere quella di rivedere le chiamate ADO e vedere se il numero di chiamate può essere ridotto o distribuito in modo che non tutte le chiamate avvengano contemporaneamente. Ridurre il numero in qualsiasi momento dovrebbe ridurre i tempi di attesa.

Se il problema persiste, considerare la possibilità di correggere la "compilabilità" dei proc memorizzati. Forse suddividerli in blocchi più piccoli che potrebbero ridurli ai secchi piccoli o medi e consentire compilazioni più parallele. O determinare perché i proc devono essere ricompilati ogni volta. Verifica se possono essere riscritti in modo tale che non debbano essere ricompilati. Infine, prenderei in considerazione l'utilizzo delle guide di piano. Ciò consentirà di precompilare i proc e potrebbe farti risparmiare un po 'di tempo.

Spero possa aiutare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.