El rendimiento es lento si la tabla AsyncOperationBase es demasiado grande en Microsoft Dynamics CRM

Se aplica a: Dynamics CRM 4.0Microsoft Dynamics CRM 2011Dynamics CRM 2013

Síntomas


Cuando ejecuta Microsoft Dynamics CRM 4,0, Microsoft Dynamics CRM 2011, Microsoft Dynamics CRM 2013 o Microsoft Dynamics CRM 2015, la tabla AsyncOperationBase crece para ser muy grande. Cuando la tabla contiene millones de registros, el rendimiento es lento. Además, los errores similares a los siguientes se registran en el registro de eventos de la aplicación en el servidor que ejecuta Microsoft Dynamics CRM:
Tipo de evento: ErrorEvent Source: MSCRMDeletionServiceEvent Category: NoneEvent ID: 16387Date: 2009/01/26Time: 11:41:54 AMUser: N/AComputer: CRMSERVERDescription: error: error de eliminación de servicio al limpiar la tabla = CleanupInactiveWorkflowAssembliesProcedure para obtener más información, consulte el centro de ayuda y soporte técnico en http://go.microsoft.com/fwlink/events.asp.

Resolución


Para resolver este problema, realice una limpieza de la tabla AsyncOperationBase ejecutando el siguiente script en el<OrgName>_MSCRM base de datos, donde el marcador de posición<OrgName> representa el nombre real de su organización.AdvertenciaAntes de limpiar los datos, tenga en cuenta que los trabajos del sistema completados tienen valor para empresas en algunos casos y deben almacenarse por un período largo. Por lo tanto, debe hablar antes con el personal de administración de su organización. Trabajos del sistema afectados:
  • Colección de datos SQM. Las métricas de calidad de software recopilan datos para el programa de experiencia del cliente.
  • Actualice el trabajo de SQL de Estados de contrato. Este trabajo se ejecuta una vez por día a medianoche. Este trabajo establece los contratos expirados en un estado de expirado.
  • Índice del catálogo de texto completo de la organización. Llena el índice de texto completo en la base de datos para buscar artículos de Microsoft Knowledge base en CRM.
Si se cancelan los trabajos periódicos, se eliminarán. Notas
  • Para Microsoft Dynamics CRM El script SQL de este artículo de Knowledge base es un esfuerzo único. Puede agregarlo como trabajo de SQL para que se ejecute semanalmente, semanalmente o mensualmente. A medida que se ejecuta el CRM, debe aplicar este artículo semanalmente, en función de las necesidades de su empresa, o aplicar la solución mediante la escritura de trabajos de eliminación en masa personalizados. (Consulta la documentación del SDK de CRM en la propiedad BulkDeleteRequest. QuerySet , en la clase BulkDeleteRequest y en el orden de eliminación)
  • Asegúrese de que los registros de la AsyncOperation para flujos de trabajo y los registros correspondientes se eliminan del objeto WorkflowLogBase .
  • Asegúrese de que se eliminan todos los registros bulkdeletefailure y bulkdeleteoperation correspondientes.
  • Asegúrese de que solo se eliminan los siguientes tipos de operaciones asincrónicas si el código de estado de los tipos es 3 y el código de estado de los tipos es 30 o 32:
    • Tarea de expansión de flujo de trabajo (1)
    • Recopilar datos de SQM (9)
    • PersistMatchCode (12)
    • FullTextCatalogIndex (25)
    • UpdateContractStates (27)
    • Flujo de trabajo (10)
IF EXISTS (SELECT name from sys.indexesWHERE name = N'CRM_AsyncOperation_CleanupCompleted')      DROP Index AsyncOperationBase.CRM_AsyncOperation_CleanupCompletedGOCREATE NONCLUSTERED INDEX CRM_AsyncOperation_CleanupCompletedON [dbo].[AsyncOperationBase] ([StatusCode],[StateCode],[OperationType])GOwhile(1=1)begindeclare @DeleteRowCount int = 10000declare @rowsAffected intdeclare @DeletedAsyncRowsTable table (AsyncOperationId uniqueidentifier not null primary key)insert into @DeletedAsyncRowsTable(AsyncOperationId)Select top (@DeleteRowCount) AsyncOperationId from AsyncOperationBasewhere   OperationType in (1, 9, 12, 25, 27, 10)   AND StateCode = 3   AND StatusCode in (30, 32) select @rowsAffected = @@rowcount  delete poa from PrincipalObjectAccess poa    join WorkflowLogBase wlb on    poa.ObjectId = wlb.WorkflowLogId   join @DeletedAsyncRowsTable dart on    wlb.AsyncOperationId = dart.AsyncOperationIddelete WorkflowLogBase from WorkflowLogBase W, @DeletedAsyncRowsTable dwhere   W.AsyncOperationId = d.AsyncOperationId              delete BulkDeleteFailureBase From BulkDeleteFailureBase B, @DeletedAsyncRowsTable dwhere   B.AsyncOperationId = d.AsyncOperationIddelete BulkDeleteOperationBase From BulkDeleteOperationBase O, @DeletedAsyncRowsTable dwhere   O.AsyncOperationId = d.AsyncOperationIddelete WorkflowWaitSubscriptionBase from WorkflowWaitSubscriptionBase WS, @DeletedAsyncRowsTable dwhere   WS.AsyncOperationId = d.AsyncOperationID  delete AsyncOperationBase From AsyncOperationBase A, @DeletedAsyncRowsTable dwhere   A.AsyncOperationId = d.AsyncOperationId/*If not calling from a SQL job, use the WAITFOR DELAY*/if(@DeleteRowCount > @rowsAffected)  returnelse  WAITFOR DELAY '00:00:02.000'end

Mejorar el rendimiento de la secuencia de comandos de eliminación

  • Para mejorar el rendimiento general de Microsoft Dynamics CRM, programe el servicio de eliminación de Microsoft Dynamics CRM para que se ejecute durante las horas de menor actividad para Microsoft Dynamics CRM. De forma predeterminada, el servicio se ejecuta en el momento en que se instaló Microsoft Dynamics CRM. Sin embargo, puede configurar el servicio para que se ejecute en 10:00 PM, en lugar de hacerlo en el momento predeterminado. Para hacerlo, use el editor de trabajos de Microsoft Dynamics CRM ScaleGroup. Para obtener más información, visite el siguiente sitio web de CodePlex: Notas
    1. Esta acción no afecta directamente al rendimiento de la secuencia de comandos.
    2. El editor de trabajos para Microsoft Dynamics CRM 4,0 se ha depecrated y ya no está disponible.
  • Para mejorar el rendimiento de las secuencias de comandos de eliminación en este artículo y mejorar el código del servicio de eliminación de Microsoft Dynamics CRM que ejecuta una eliminación similar, agregue los tres índices siguientes a la OrganizationName_MSCRM base de datos antes de ejecutar la secuencia de comandos de eliminación en este artículo:
    CREATE NONCLUSTERED INDEX CRM_WorkflowLog_AsyncOperationID ON [dbo].[WorkflowLogBase] ([AsyncOperationID])GO CREATE NONCLUSTERED INDEX CRM_DuplicateRecord_AsyncOperationID ON [dbo].[DuplicateRecordBase] ([AsyncOperationID])GOCREATE NONCLUSTERED INDEX CRM_BulkDeleteOperation_AsyncOperationID ON [dbo].[BulkDeleteOperationBase](AsyncOperationID)GO
    Nota Si no agrega estos índices, la secuencia de comandos de eliminación puede demorar horas en ejecutarse.
  • Detenga el servicio de procesamiento asincrónico de Microsoft Dynamics CRM mientras ejecuta este script.
  • Faculta Vuelva a crear los siguientes índices y actualice las estadísticas:
    -- Rebuild Indexes & Update Statistics on AsyncOperationBase Table ALTER INDEX ALL ON AsyncOperationBase REBUILD WITH (FILLFACTOR = 80, ONLINE = OFF,SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF)GO -- Rebuild Indexes & Update Statistics on WorkflowLogBase Table ALTER INDEX ALL ON WorkflowLogBase REBUILD WITH (FILLFACTOR = 80, ONLINE = OFF,SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF)GO
  • Faculta Actualice las estadísticas con el examen completo de todas las tablas que participan en esta consulta con los siguientes comandos (preferiblemente en horas pico):
    UPDATE STATISTICS [dbo].[AsyncOperationBase] WITH FULLSCANUPDATE STATISTICS [dbo].[DuplicateRecordBase] WITH FULLSCANUPDATE STATISTICS [dbo].[BulkDeleteOperationBase] WITH FULLSCANUPDATE STATISTICS [dbo].[WorkflowCompletedScopeBase] WITH FULLSCANUPDATE STATISTICS [dbo].[WorkflowLogBase] WITH FULLSCANUPDATE STATISTICS [dbo].[WorkflowWaitSubscriptionBase] WITH FULLSCAN
  • Faculta Cambie el modelo de recuperación de la base de datos de MSCRM a simple para evitar la generación excesiva de registros de Microsoft SQL Server. Para SQL Server 2005, inicie sesión en Microsoft SQL Server Management Studio como administrador, haga clic con el botón secundario en el <org_name>_MSCRM base de datos, haga clic en propiedades, haga clic en Opcionesy, a continuación, haga clic en modelo de recuperación. Marque simpley, a continuación, haga clic en Aceptar. Después de ejecutar esta secuencia de comandos por primera vez, el <>_MSCRM org_name modelo de recuperación de la base de datos se debe volver a completa para obtener el mejor modelo de recuperación de datos.
  • Para aumentar el rendimiento de la secuencia de comandos, se puede reducir el valor @DeleteRowCount de 10.000
Para determinar el número de registros que debe eliminar la secuencia de comandos de este artículo, ejecute la siguiente secuencia de comandos de recuento contra el OrganizationName_MSCRM base de datos:
Select Count(AsyncOperationId)from AsyncOperationBase WITH (NOLOCK)where OperationType in (1, 9, 12, 25, 27, 10) AND StateCode = 3 AND StatusCode IN (30,32) 
Error de scriptAl ejecutar el script de limpieza, puede recibir un mensaje de error similar al siguiente:
La instrucción DELETE entra en conflicto con la restricción de referencia "asyncoperation_workflowwaitsubscription". El conflicto se produjo en la base de datos "Contoso_MSCRM", tabla "dbo. WorkflowWaitSubscriptionBase ", columna ' AsyncOperationId '. La instrucción ha sido terminada.
Si recibe este mensaje de error, detenga el script de limpieza y siga estos pasos para quitar el resto de los registros de WorkflowWaitSubscription que existen para los flujos de trabajo completados o cancelados. Estos registros ya no deberían existir porque deberían haberse eliminado cuando se completaron o cancelaron los flujos de trabajo. No debe ver los registros devueltos de esta consulta. Cualquier cosa que quede en la tabla WorkflowWaitSubscriptionBase que aparece en esta consulta es un registro huérfano. No puede eliminar estos registros a través de la interfaz de usuario porque el proceso asincrónico de Microsoft CRM se encuentra en estado cancelado o cancelado. La siguiente secuencia de comandos verificará cuántos registros huérfanos WorkflowWaitSubscriptionBase existen para los registros de flujo de trabajo completados y cancelados:
select count(*) from workflowwaitsubscriptionbase WITH (NOLOCK) where asyncoperationid in (Select asyncoperationid from AsyncOperationBase WITH (NOLOCK) where OperationType in (1, 9, 12, 25, 27, 10) AND StateCode = 3 AND StatusCode IN (30,32)) 
La siguiente secuencia de comandos eliminará los registros de WorkflowWaitSubscriptionBase de los registros de WorkflowWaitSubscriptionBase en desuso para los registros de flujo de trabajo completados y cancelados:
delete from workflowwaitsubscriptionbase where asyncoperationid in(Select asyncoperationidfrom AsyncOperationBasewhere OperationType in (1, 9, 12, 25, 27, 10) AND StateCode = 3 AND StatusCode IN (30,32))
Una vez ejecutada esta instrucción Delete, el script de limpieza de AsyncoperationBase y Workflow se completará correctamente.

Más información


Para obtener más información, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
954929 La entidad AsyncOperation consume una parte significativa de [org] _MSCRM base de datos y provoca un bajo rendimiento en Microsoft Dynamics CRM
957871 Los registros de la tarea de expansión del flujo de trabajo hacen que la tabla AsyncOperationBase de la base de datos de MSCRM crezca demasiado en Microsoft Dynamics CRM 4,0
Para obtener más información acerca de la terminología de actualizaciones de software, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
824684 Descripción de la terminología estándar utilizada para describir las actualizaciones de software de Microsoft
Para obtener más información sobre la revisión del software de Microsoft Business Solutions CRM y la terminología del paquete de actualización, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
887283 Los estándares de nomenclatura de paquetes de actualización y corrección de software de Microsoft Business Solutions CRM