O desempenho é lento se a tabela AsyncOperationBase se tornar demasiado grande no Microsoft Dynamics CRM

Aplica-se A
Dynamics CRM 4.0 Microsoft Dynamics CRM 2011 Dynamics CRM 2013 Dynamics CRM 2015

Sintomas

Quando executa Microsoft Dynamics CRM 4.0, Microsoft Dynamics CRM 2011, Microsoft Dynamics CRM 2013 ou Microsoft Dynamics CRM 2015, a tabela AsyncOperationBase torna-se muito grande. Quando a tabela contém milhões de registos, o desempenho é lento.

Além disso, os erros semelhantes aos seguintes são registados no registo de eventos da aplicação no servidor que está a executar Microsoft Dynamics CRM:

Nota

Tipo de Evento: Erro

Origem do Evento: MSCRMDeletionService

Categoria do Evento: Nenhuma

ID do Evento: 16387

Data: 01/2009/26

Hora: 11:41:54

Utilizador: N/D

Computador: CRMSERVER

Descrição: Erro: O Serviço de Eliminação não conseguiu limpar table=CleanupInactiveWorkflowAssembliesProcedure Para obter mais informações, consulte Centro de Ajuda e Suporte em http://go.microsoft.com/fwlink/events.asp.

Resolução

Para resolver este problema, efetue uma limpeza da tabela AsyncOperationBase ao executar o seguinte script na base de dados orgName<>_MSCRM, onde o marcador<de posição OrgName>** representa o nome real da sua organização.

Aviso Antes de limpar os dados, tenha em atenção que as tarefas de sistema concluídas têm valor comercial em alguns casos e têm de ser armazenadas durante um longo período. Por conseguinte, deve discutir esta questão primeiro com a equipa de administração da sua organização.

Tarefas de sistema afetadas:

  • Recolha de dados SQM. As Métricas de Qualidade do Software recolhem dados para o programa de experiência do cliente.

  • Atualizar Tarefa sqL do Estado do Contrato. Esta tarefa é executada uma vez por dia à meia-noite. Esta tarefa define os contratos expirados para um estado expirado.

  • Índice de Catálogo de Texto Completo da Organização. Preenche o índice de texto completo na base de dados para procurar artigos da Base de Dados de Conhecimento Microsoft no CRM.

Se os trabalhos periódicos tiverem sido cancelados, serão removidos.

Notas

  • Para Microsoft Dynamics CRM O script SQL neste artigo da Base de Dados de Conhecimento é apenas um esforço único. Pode adicioná-lo como uma tarefa do SQL para ser executada de forma periódica, semanal ou mensal. À medida que o CRM é executado, tem de aplicar este artigo semanalmente, consoante as suas necessidades empresariais, ou aplicar a solução ao escrever tarefas DE ELIMINAÇÃO EM MASSA personalizadas. (Veja a nossa documentação do SDK crm na propriedade BulkDeleteRequest.QuerySet, na classe BulkDeleteRequest e na ordem de eliminação)

  • Confirme que os registos AsyncOperation dos fluxos de trabalho e os registos correspondentes são eliminados do objeto WorkflowLogBase.

  • Confirme que todos os registos de bulkdeletefailure e bulkdeleteoperation correspondentes são eliminados.

  • Certifique-se de que apenas os seguintes tipos de operação Assíncrona são eliminados se o código de estado dos tipos for 3 e o código de estado dos tipos for 30 ou 32:

    • Tarefa de Expansão do Fluxo de Trabalho (1)
    • Recolher dados do SQM (9)
    • PersistMatchCode (12)
    • FullTextCatalogIndex (25)
    • UpdateContractStates (27)
    • Fluxo de trabalho (10)
IF EXISTS (SELECT name from sys.indexes
WHERE 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

        
      

Melhorar o desempenho do script de eliminação

  • Para melhorar o desempenho geral do Microsoft Dynamics CRM, agende o Serviço de Eliminação de Microsoft Dynamics CRM para ser executado fora das horas de ponta para Microsoft Dynamics CRM. Por predefinição, o serviço é executado no momento em que Microsoft Dynamics CRM foi instalado. No entanto, pode definir o serviço para ser executado às 22:00 em vez de na hora predefinida. Para tal, utilize o editor de tarefas Microsoft Dynamics CRM ScaleGroup. Para obter mais informações, visite o seguinte site do CodePlex:
    http://crmjobeditor.codeplex.com/ Notas

    1. Esta ação não afeta diretamente o desempenho do script.
    2. O editor de tarefas do Microsoft Dynamics CRM 4.0 foi despecificado e já não está disponível.
  • Para melhorar o desempenho dos scripts de eliminação neste artigo e melhorar o Microsoft Dynamics CRM código do Serviço de Eliminação que executa eliminações semelhantes, adicione os três índices seguintes à base de dados OrganizationName_MSCRM antes de executar o script de eliminação neste artigo:

    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 Se não adicionar estes índices, o script de eliminação pode demorar horas a ser executado.

  • Pare a Microsoft Dynamics CRM Serviço de Processamento Assíncrono enquanto executa este script.

  • Opcional Recrie os seguintes índices e atualize as estatí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
    
  • Estatísticas de Atualização Opcionais com Análise Completa em todas as tabelas envolvidas nesta consulta através dos seguintes comandos (de preferência, fora das horas de ponta):

    UPDATE STATISTICS [dbo].[AsyncOperationBase] WITH FULLSCAN
    UPDATE 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 Altere o modelo de recuperação da base de dados MSCRM para Simples para evitar o excesso de geração de registos do Microsoft SQL Server. Para SQL Server 2005, inicie sessão no Microsoft SQL Server Management Studio como Administrador, clique com o botão direito do rato na base <de dados org_name>_MSCRM, clique em Propriedades, clique em Opções e, em seguida, clique em Modelo de Recuperação. Marque Simples e, em seguida, clique em OK. Depois de executar este script pela primeira vez, o <>org_name_MSCRM modelo de recuperação de base de dados deve ser mudado novamente para FULL para o melhor modelo de recuperação de dados.

  • Para aumentar o desempenho do script, o @DeleteRowCount valor de 10 000 pode ser reduzido

            
Para determinar o número de registos a eliminar pelo script neste artigo, execute o seguinte script de contagem na base de dados OrganizationName_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) 

Erro de script

Ao executar o script de limpeza, poderá receber uma mensagem de erro semelhante à seguinte:

Nota

A instrução DELETE entrou em conflito com a restrição REFERENCE "asyncoperation_workflowwaitsubscription". O conflito ocorreu na base de dados "Contoso_MSCRM", tabela "dbo. WorkflowWaitSubscriptionBase", coluna "AsyncOperationId". A declaração foi encerrada.

            
Se receber esta mensagem de erro, pare o script de limpeza e, em seguida, siga estes passos para remover os restantes registos WorkflowWaitSubscription que existem para fluxos de trabalho concluídos ou cancelados. Estes registos já não deveriam existir porque deveriam ter sido eliminados quando os fluxos de trabalho foram concluídos ou cancelados. Não deverá ver registos devolvidos desta consulta. Tudo o que resta na tabela WorkflowWaitSubscriptionBase que aparece nesta consulta é um registo órfão. Não é possível eliminar estes registos através da IU porque o processo Assíncrono do Microsoft CRM está num estado cancelado ou concluído.

O script seguinte verificará quantos registos órfãos workflowWaitSubscriptionBase existem para registos de fluxo de trabalho concluídos e 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)) 

O script seguinte eliminará os registos WorkflowWaitSubscriptionBase para registos WorkflowWaitSubscriptionBase encalhados para registos de fluxo de trabalho concluídos e 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))

Após a execução desta instrução de eliminação, o script de limpeza AsyncoperationBase e Fluxo de Trabalho será concluído com êxito.

Mais Informações

Para obter mais informações, clique nos seguintes números de artigo para ver os artigos na Base de Dados de Conhecimento Microsoft:

954929 A entidade AsyncOperation consome uma parte significativa da base de dados [Org]_MSCRM e causa um fraco desempenho no Microsoft Dynamics CRM

957871 Os registos da Tarefa de Expansão do Fluxo de Trabalho fazem com que a tabela AsyncOperationBase na base de dados MSCRM cresça demasiado grande no Microsoft Dynamics CRM 4.0 Para obter mais informações sobre a terminologia de atualização de software, clique no seguinte número de artigo para ver o artigo na Base de Dados de Conhecimento Microsoft:

824684 Descrição da terminologia padrão utilizada para descrever as atualizações de software da MicrosoftPara obter mais informações sobre a terminologia do pacote de atualização e correção de software crm do Microsoft Business Solutions, clique no seguinte número de artigo para ver o artigo na Base de Dados de Conhecimento Microsoft:

887283 normas de nomenclatura de software CRM da Microsoft Business Solutions