Descripción de SQL Server bloqueo causado por los bloqueos de compilación

Seleccione idioma Seleccione idioma
Id. de artículo: 263889 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En Microsoft SQL Server, sólo una copia de un plan de procedimiento almacenado es por lo general, en la caché cada vez. Hacer cumplir Esto requiere la serialización de algunas partes del proceso de compilación y se lleva a cabo esta sincronización parcial mediante el uso de bloqueos de compilación. Si muchas de las conexiones son que se ejecutan simultáneamente el mismo procedimiento almacenado y se debe obtener un bloqueo de compilación para dicho procedimiento almacenado cada vez que se ejecuta, podría comenzar el proceso de sistema (SPID) de los identificadores que se bloqueen entre sí cada cuando tratan de obtener un bloqueo exclusivo de la compilación en el objeto.

Más información

Recompilación del procedimiento almacenado es una explicación de los bloqueos de compilación en un procedimiento almacenado o desencadenador. En este caso, la solución es reducir o eliminar las recompilaciones. Para obtener una explicación de las razones más comunes que puede tener un procedimiento almacenado que se vuelva a compilar y alguna información útil de reducir la frecuencia de recompilaciones, consulte el siguiente artículo de Microsoft Knowledge Base:
243586Solución de problemas de recompilación del procedimiento almacenado
Otro escenario en el que se producen bloqueos de compilación es cuando se cumplen las condiciones siguientes:
  • El usuario que se ejecuta el procedimiento almacenado no es el propietario del procedimiento.
  • El nombre del procedimiento almacenado no se completa con el nombre del propietario del objeto.
Por ejemplo, si el usuario "dbo" es el propietario de objetodbo.MyStoredProcy, por otro usuario, "Harry", ejecuta este procedimiento almacenado utilizando el comando "exec mystoredproc," la búsqueda en caché inicial por el nombre de objeto se produce un error porque el objeto no está calificada por el propietario. (Aún no se conoce si existe otro procedimiento almacenado denominado Harry.mystoredproc. Por lo tanto, SQL Server no puede estar seguro de que el plan almacenado en caché para dbo.mystoredproc es la correcta ejecución.) SQL Server, a continuación, obtiene un bloqueo exclusivo de la compilación en el procedimiento y hace preparados para compilar el procedimiento. Esto incluye la resolución del nombre de objeto a un identificador de objeto. Antes de que SQL Server compila el plan, SQL Server utiliza este identificador de objeto para realizar una búsqueda más precisa de la caché de procedimientos y se puede encontrar un plan compilado previamente incluso sin la calificación de propietario.

Si se encuentra un plan existente, SQL Server reutiliza el plan almacenado en caché y no se compila en realidad el procedimiento almacenado. Sin embargo, la falta de calificación de propietario obliga a que SQL Server para realizar una segunda búsqueda en la caché y obtener un bloqueo exclusivo de la compilación antes de que el sistema determina que se puede volver a utilizar el plan de ejecución de caché existente. Obtiene el bloqueo y realiza las búsquedas y otras tareas que se necesitan para alcanzar este punto pueden introducir un retraso de los bloqueos de compilación que conduce a bloquear. Esto es especialmente cierto si muchos usuarios que no están propietario del procedimiento almacenado que simultáneamente se ejecuta el procedimiento sin proporcionar el nombre del propietario. Tenga en cuenta que incluso si no ve los SPID que espera de bloqueos de compilación, falta de calificación de propietario puede introducir retrasos en la ejecución del procedimiento almacenado y hacer que la utilización de CPU innecesariamente alta.

La siguiente secuencia de sucesos se grabarán en una traza del analizador de SQL Server cuando se produce este problema. (Para realizar el seguimiento de sucesos relacionados con la memoria caché, debe habilitar eventos avanzados. Para ello, haga clic enOpcionesen elHerramientasmenú y, a continuación, seleccioneTodas las clases de evento.)

Contraer esta tablaAmpliar esta tabla
Clase de eventoTexto
RPC: StartingMyStoredProc
SP:CacheMissMyStoredProc
SP:ExecContextHitMyStoredProc
SP: StartingMyStoredProc
......

SP:CacheMissse produce cuando se produce un error en la búsqueda en caché por su nombre. El siguienteSP:ExecContextHitindica que un plan almacenado en caché correspondiente, en última instancia se ha encontrado en caché después de que el nombre del objeto ambiguos se resuelven en un identificador de objeto. Según las circunstancias,SP:CacheHites posible que aparezca en lugar deSP:ExecContextHit.

La solución a este problema de bloqueo de compilación es asegurarse de que las referencias a procedimientos almacenados están calificados por el propietario. (En lugar deEXEC mystoredproc, utilice execdbo.MyStoredProc.) Aunque la calificación de propietario es importante por motivos de rendimiento, no es necesario calificar el procedimiento almacenado con el nombre de la base de datos para evitar que la búsqueda en caché adicionales.

El bloqueo se debe a la compilación se pueden detectar bloqueos mediante el uso de secuencias de comandos de bloqueo como los que se definen en los siguientes artículos de Microsoft Knowledge Base:
251004INF: Cómo supervisar los bloqueos de SQL Server 7.0
271509INF: Cómo supervisar los bloqueos de SQL Server 2000
Éstas son algunas características típicas de bloqueo de compilación que se pueden observar en la salida de secuencia de comandos de bloqueo:
  • lastwaittypepara los SPID bloqueados y bloqueo (normalmente) es LCK_M_X (exclusivo) ywaitresourcetiene el formato "TAB: dbid:object_id[[Compilación]],"donde"object_id"es el identificador de objeto del procedimiento almacenado.
  • Tienen los bloqueadores de elementoswaittype0 x 0000, puede ejecutar el estado. Tiene blockeeswaittype0x000e (exclusivo), estado de hibernación.
  • Aunque la duración de la incidencia de bloqueo puede ser larga, no hay ningún SPID única que está bloqueando otros SPID de los durante mucho tiempo. No hay bloqueo de desplazamiento. Tan pronto como una compilación está completa, SPID otra asume la función de la cabeza del bloqueador de elementos para un varios segundos o menos y así sucesivamente.
La siguiente información procede de una instantánea desysprocessesdurante este tipo de bloqueo:
   spid  blocked  waittype  waittime  lastwaittype  waitresource
   ----  -------  --------  --------  ------------  -------------------------
   
   221    29      0x000e    2141      LCK_M_X       TAB: 6:834102 [[COMPILE]]
   228    29      0x000e    2235      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    29   214      0x000e    3937      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    13   214      0x000e    1094      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    68   214      0x000e    1968      LCK_M_X       TAB: 6:834102 [[COMPILE]]
   214     0      0x0000       0      LCK_M_X       TAB: 6:834102 [[COMPILE]]
En elwaitresourcecolumna ("6:834102"), 6 es el identificador de la base de datos y 834102 es el identificador de objeto. Tenga en cuenta que este ID. de objeto pertenece a un procedimiento almacenado, no a una tabla (a pesar del tipo de bloqueo "TAB").

Notas
  • Si utiliza SQL Server 2005, ahora muchas de las tablas del sistema de SQL Server 2000 se implementan como un conjunto de vistas. Estas vistas se conocen como las vistas de compatibilidad, y están diseñados sólo para compatibilidad con versiones anteriores. Las vistas de la compatibilidad de exponen los mismos metadatos que estaba disponible en SQL Server 2000. For more information about mapping between the SQL Server 2000 system tables and the SQL Server 2005 system views, see the "Mapping SQL Server 2000 System Tables to SQL Server 2005 System Views" topic in SQL Server 2005 Books Online.
  • If your stored procedure name starts with the "sp_" prefix and is not in the master database, you seeSP:CacheMissbefore the cache hit for each execution even if you owner-qualify the stored procedure. This is because the sp_ prefix tells SQL Server that the stored procedure is a system stored procedure, and system stored procedures have different name resolution rules. (The "preferred" location is in the master database.) The names of user-created stored procedures should not start with "sp_".
  • If an owner-qualified procedure is executed with a different case than the owner-qualified procedure was created as, the owner-qualified procedure can obtain aCacheMissor request a COMPILE lock but eventually use the cached plan. Therefore, this would not actually recompile the procedure and should not cause much of an overhead. But in certain situations, the request for a COMPILE lock can cause a "blocking chain" situation if there are many SPIDs trying to execute the same procedure with a different case than the procedure was created as. This is true regardless of the sort order or collation that is being used on the server or on the database. The reason for this behavior is that the algorithm that is being used to find the procedure in cache is based on hash values (for performance reasons), which can change if the case is different.

    The workaround is to drop and create the procedure with the same case as the procedure is executed by the application. You can also make sure that the procedure is executed from all applications that use the same case.
  • If you try to execute a stored procedure as a Language Event instead of as an RPC, SQL Server must parse and compile the language event query, determine that the query is trying to execute the particular procedure, and then try to find a plan in cache for that procedure. To avoid this situation in which SQL Server must parse and compile the language event, make sure that the query is sent to SQL as an RPC.

    For more information, see the "System Stored Procedures" section in the Books Online article "Creating a Stored Procedure."


Known issues

Here are some known issues that can prevent plan caching:
  • You use BLOB variables as a Stored Procedure parameter. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
    2380435FIX: The query plan for a stored procedure is not cached if the stored procedure uses a BLOB variable and the variable is used in a string function in Microsoft SQL Server 2008
  • You use OPEN SYMMETRIC KEY in a Stored Procedure/Query Batch. For more information, see the following MSDN blog entry:
    http://blogs.msdn.com/b/sqlserverfaq/Archive/2010/09/08/Open-Symmetric-Key-Command-prevents-Query-plan-Caching.aspx

Propiedades

Id. de artículo: 263889 - Última revisión: miércoles, 24 de noviembre de 2010 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 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
Palabras clave: 
kbinfo kbmt KB263889 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 263889

Enviar comentarios

 

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