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

Síntomas

Cuando ejecuta Microsoft Dynamics CRM 4.0, Microsoft Dynamics CRM 2011, 2013 de Microsoft Dynamics CRM o Microsoft Dynamics CRM 2015 la tabla AsyncOperationBase crece a ser muy grande. Cuando la tabla contiene millones de registros, el rendimiento es lento.

Además, se registran errores similares a los siguientes en el registro de sucesos de aplicación en el servidor que está ejecutando Microsoft Dynamics CRM:
Tipo de suceso: Error

Origen del evento: MSCRMDeletionService

Categoría del suceso: ninguna

Id. de suceso: 16387

Fecha: 2009/01/26

Hora: 11:41:54 AM

Usuario: N/D

Equipo: CRMSERVER

Descripción: Error: el servicio de eliminación no pudo limpiar tabla = CleanupInactiveWorkflowAssembliesProcedure para obtener más información, consulte Centro de ayuda y soporte técnico en http://go.microsoft.com/fwlink/events.asp.

Solución

Para resolver este problema, ejecute el script siguiente contra la base de datos de< nombreorg >_MSCRM, donde el marcador de posición< nombreorg > representa el nombre real de la organización para realizar una limpieza de la tabla AsyncOperationBase.

Advertencia Antes de limpiar los datos, tenga en cuenta que los trabajos del sistema completados tienen valor comercial, en algunos casos y tendrán que almacenarse durante un largo período. Por lo tanto, debería comentar esto con el personal de administración de la organización en primer lugar.

Trabajos del sistema que se ven afectados:
  • Recopilación de datos SQM. Métrica de calidad de software recopila datos para el programa la experiencia.
  • Trabajo SQL actualizar estados de contrato. Este trabajo ejecuta una vez al día a medianoche. Este trabajo establece los contratos caducados en un estado caducado.
  • Índice del catálogo de texto completo de 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 han cancelado los trabajos periódicos, se eliminarán.

Notas:
  • Para Microsoft Dynamics CRM La secuencia de comandos SQL en este artículo de Knowledge Base es sólo un esfuerzo puntual. Se puede agregar como un trabajo SQL para que se ejecute periódicamente nocturnos, semanales o mensuales. Mientras se ejecuta su CRM, deberá aplicar este artículo semanal, dependiendo de sus necesidades de negocio, o aplique la solución mediante la escritura de trabajos de eliminación en masa personalizados. (Consulte la documentación de SDK de CRM en la propiedad BulkDeleteRequest.QuerySet , en la clase BulkDeleteRequest y del orden de eliminación)
  • Asegúrese de que los registros de operación asincrónica para flujos de trabajo y los registros correspondientes se eliminan desde el objeto WorkflowLogBase .

  • Asegúrese de que se eliminen todas las bulkdeletefailure correspondiente y los registros de masa.

  • Asegúrese de que sólo los tipos siguientes de la operación asincrónica se eliminan 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)
    • Recopilación de datos 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_CleanupCompleted
GO
CREATE NONCLUSTERED INDEX CRM_AsyncOperation_CleanupCompleted
ON [dbo].[AsyncOperationBase] ([StatusCode],[StateCode],[OperationType])
GO

while(1=1)
begin
declare @DeleteRowCount int = 10000
declare @rowsAffected int
declare @DeletedAsyncRowsTable table (AsyncOperationId uniqueidentifier not null primary key)
insert into @DeletedAsyncRowsTable(AsyncOperationId)
Select top (@DeleteRowCount) AsyncOperationId from AsyncOperationBase
where
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.AsyncOperationId
delete WorkflowLogBase from WorkflowLogBase W, @DeletedAsyncRowsTable d
where
W.AsyncOperationId = d.AsyncOperationId
delete BulkDeleteFailureBase From BulkDeleteFailureBase B, @DeletedAsyncRowsTable d
where
B.AsyncOperationId = d.AsyncOperationId
delete BulkDeleteOperationBase From BulkDeleteOperationBase O, @DeletedAsyncRowsTable d
where
O.AsyncOperationId = d.AsyncOperationId
delete WorkflowWaitSubscriptionBase from WorkflowWaitSubscriptionBase WS, @DeletedAsyncRowsTable d
where
WS.AsyncOperationId = d.AsyncOperationID
delete AsyncOperationBase From AsyncOperationBase A, @DeletedAsyncRowsTable d
where
A.AsyncOperationId = d.AsyncOperationId
/*If not calling from a SQL job, use the WAITFOR DELAY*/
if(@DeleteRowCount > @rowsAffected)
return
else
WAITFOR DELAY '00:00:02.000'
end


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

  • Para mejorar el rendimiento global de Microsoft Dynamics CRM, programar el servicio de eliminación de Microsoft Dynamics CRM para que se ejecute durante horas de poca 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 establecer el servicio para ejecutarse a las 10:00 P.M. en lugar de en el tiempo predeterminado. Para ello, utilice el Editor de trabajo 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 trabajo de Microsoft Dynamics CRM 4.0 ha sido 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 de servicio de eliminación de Microsoft Dynamics CRM que ejecuta algún otro, agregue los siguientes tres índices en la base de datos Nombredeorganización_mscrm 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])
    GO

    CREATE NONCLUSTERED INDEX CRM_BulkDeleteOperation_AsyncOperationID ON [dbo].[BulkDeleteOperationBase]
    (AsyncOperationID)
    GO

    Nota: Si no agrega estos índices, la secuencia de comandos de eliminación puede tardar horas en ejecutarse.

  • Detenga el servicio de procesamiento asincrónico de Microsoft Dynamics CRM mientras ejecuta esta secuencia de comandos.
  • Opcional Reconstruir los índices siguientes y actualizar 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
  • Opcional Actualizar las estadísticas con análisis completo en todas las tablas que participan en esta consulta mediante los comandos siguientes (preferiblemente en off las horas):
    UPDATE STATISTICS [dbo].[AsyncOperationBase] WITH FULLSCANUPDATE STATISTICS [dbo].[DuplicateRecordBase] WITH FULLSCAN
    UPDATE STATISTICS [dbo].[BulkDeleteOperationBase] WITH FULLSCAN
    UPDATE STATISTICS [dbo].[WorkflowCompletedScopeBase] WITH FULLSCAN
    UPDATE STATISTICS [dbo].[WorkflowLogBase] WITH FULLSCAN
    UPDATE STATISTICS [dbo].[WorkflowWaitSubscriptionBase] WITH FULLSCAN
  • Opcional Cambiar el modelo de recuperación de la base de datos MSCRM en Simple evitar el exceso de generación de registros de Microsoft SQL Server. Para SQL Server 2005, inicie una sesión en la de Microsoft SQL Server Management Studio como administrador, haga clic en la base de datos de < NOMBRE_ORG > _MSCRM, haga clic en Propiedades, haga clic en Opcionesy, a continuación, haga clic en El modelo de recuperación. Marque Simpley, a continuación, haga clic en Aceptar. Después de ejecutar esta secuencia de comandos de la primera vez, debe cambiarse el modelo de recuperación de base de datos de < NOMBRE_ORG > _MSCRM al completo para el modelo de recuperación de datos mejor.
  • Para aumentar el rendimiento de la secuencia de comandos, se puede reducir el valor de @DeleteRowCount de 10.000


Para determinar el número de registros que desea eliminar la secuencia de comandos en este artículo, ejecute el siguiente script de recuento en la base de datos Nombredeorganización_mscrm:
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 secuencia de comandos

Al ejecutar la secuencia de comandos de limpieza, puede recibir un mensaje de error similar al siguiente:

La instrucción DELETE en conflicto con la restricción de referencia "asyncoperation_workflowwaitsubscription". Se produjo el conflicto en la base de datos "Contoso_MSCRM," tabla "dbo." WorkflowWaitSubscriptionBase", columna 'AsyncOperationId'. Se terminó la instrucción.


Si recibe este mensaje de error, detener la secuencia de comandos de limpieza y, a continuación, siga estos pasos para quitar los registros restantes de WorkflowWaitSubscription que existen para los flujos de trabajo completados o cancelados. Estos registros ya no deben existir, porque debe eliminados cuando los flujos de trabajo se ha completado o cancelados. No debería ver todos los registros que se devuelven a partir de esta consulta. Nada se deja en la tabla de 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 está en un estado completado o cancelado.

La siguiente secuencia de comandos comprobará cuántos registros huérfanos de WorkflowWaitSubscriptionBase existen para los registros de flujo de trabajo completado y canceladas:

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 para registros desuso de WorkflowWaitSubscriptionBase para registros de flujo de trabajo completado y cancelados:

delete from workflowwaitsubscriptionbase where asyncoperationid in(Select asyncoperationidfrom AsyncOperationBase
where OperationType in (1, 9, 12, 25, 27, 10)
AND StateCode = 3 AND StatusCode IN (30,32))
Después de ejecuta esta instrucción delete, la secuencia de comandos de limpieza AsyncoperationBase y flujo de trabajo 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 AsyncOperation la entidad consume una parte significativa de la base de datos [organización] _MSCRM y produce un rendimiento pobre en Microsoft Dynamics CRM
957871 los registros de la tarea de expansión de flujo de trabajo hacen que la tabla AsyncOperationBase en la base de datos MSCRM aumente demasiado en Microsoft Dynamics CRM 4.0
Para obtener más información acerca de la terminología de la actualización 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 que se utiliza para describir las actualizaciones de software de Microsoft
Para obtener más información acerca de terminología del paquete de revisión y actualización de software Microsoft Business Solutions CRM, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

887283 paquete de actualizaciones y revisiones de software de Microsoft Business Solutions CRM estándares de nomenclatura

Propiedades

Id. de artículo: 968520 - Última revisión: 13 ene. 2017 - Revisión: 1

Microsoft Dynamics CRM 4.0, Microsoft Dynamics CRM 2011, Microsoft Dynamics CRM 2013, Microsoft Dynamics CRM 2015

Comentarios