Une résurgence de cette question sur MSDN: Rapport de processus bloqué: quelle est cette ressource d'attente "OBJET: 32767: 124607697: 0 [COMPILE]"
J'ai pris ces déclarations dans Profiler. Ils ont tous une durée supérieure à 3 secondes. Certains de plus de 10 ans et plus. L'activité de blocage est la même que la liaison depuis MSDN .
Les appels utilisent tous un nom en 3 parties. Tous spécifient un processus différent sous une forme semblable à celle-ci:
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
Que puis-je faire pour réduire ce niveau de blocage?
(modifier) Je vois maintenant la même chose pour:
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'
Il se passe quelque chose de systémique mais je ne sais pas quoi faire d'autre. l'appelant est VB6 via ADO. C'est ADO qui fait ces appels.
Un exemple de rapport de processus bloqué est ci-dessous
<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:^&N&#RMAlert#&S&#L#&UID&#19#&AGN&#1#&DFC&#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>
la source
Réponses:
Il existe un excellent article de blog http://blogs.msdn.com/b/support_sql_france/archive/2012/02/07/sql-server-compilation-gateways-and-resource-semaphore-query-compile.aspx qui explique ce qui est événement.
SQL Server permet un nombre défini de compilations en fonction de leur complexité. Il les regroupe en petits, moyens et grands. Pour les grandes compilations, il ne peut y en avoir qu'une seule à la fois, alors disons que tous vos procs sont considérés comme volumineux, alors chacun doit être compilé en série. Cela pourrait expliquer le blocage.
Je pense qu'il peut y avoir plusieurs approches au problème - considérez plus de ressources (plus de processeurs permettront à plus de requêtes petites et moyennes d'être simultanées ou peuvent augmenter le seuil pour ce qui est considéré comme moyen). En outre, davantage de mémoire peut résoudre le problème.
Si vous êtes comme la plupart d'entre nous, cela pourrait ne pas être possible. Une autre option pourrait être de passer en revue les appels ADO et de voir si le nombre d'appels peut être réduit ou réparti de sorte que tous les appels ne se produisent pas en même temps. La réduction du nombre à un moment donné devrait réduire votre temps d'attente.
Si cela ne fonctionne pas, envisagez de corriger la «compilabilité» des proc stockés. Peut-être les décomposer en plus petits morceaux qui pourraient les réduire aux petits ou moyens compartiments et permettre des compilations plus parallèles. Ou déterminez pourquoi les procs doivent être recompilés à chaque fois. Voyez s'ils peuvent être réécrits de sorte qu'ils n'ont pas besoin d'être recompilés. Enfin, j'envisagerais d'utiliser des guides de plan. Ceux-ci permettront de précompiler les procs et de gagner du temps.
J'espère que cela pourra aider
la source