Sintomas

Quando executam o Microsoft Dynamics CRM 4.0, o Microsoft Dynamics CRM 2011, o Microsoft Dynamics CRM 2013 ou o Microsoft Dynamics CRM 2015, a tabela AsyncOperationBase cresce para ser muito grande. Quando a tabela contém milhões de discos, o desempenho é lento. Além disso, os erros que se assemelham ao seguinte são registados no registo do evento de aplicação no servidor que está a executar o CRM da Microsoft Dynamics:

Tipo de evento: ErrorEvent Fonte: MSCRMDeletionServiceEvent Category: NoEvent ID: 16387Date: 2009/01/26Time: 11:41:54 AMUSER: N/AComputer: CRMSERVERDescription: Error: Deletion Service failed to clean up table=CleanupInactiveWorkflowAssembliesProcedure Para obter mais informações, consulte o 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 executando o seguinte script contra o<OrgName>_MSCRM base de dados, onde o espaço-reservado<OrgName> representa o nome real da sua organização.Aviso Antes de limpar os dados, esteja ciente de que os trabalhos concluídos do sistema têm valor comercial em alguns casos e têm de ser armazenados por um longo período. Portanto, primeiro deve discutir isto com o pessoal da administração da sua organização. Trabalhos de sistema afetados:

  • Recolha de dados SQM. Software Quality Metrics recolhe dados para o programa de experiência do cliente.

  • Atualizar Contrato Estados SQL trabalho. Este trabalho funciona uma vez por dia à meia-noite. Este trabalho define os contratos caducados para um estado de caducidade.

  • Índice de Catálogo de Texto Completo da Organização. Povoa índice de texto completo em db para pesquisar artigos da Base de Conhecimento do Microsoft em CRM.

Se os empregos recorrentes forem cancelados, serão removidos. Notas

  • Para Microsoft Dynamics CRM O script SQL neste artigo da Base de Conhecimento é apenas um esforço único. Pode adicionar isto como um trabalho SQL para funcionar numa base semanal ou mensal recorrente. À medida que o seu CRM funciona, tem de aplicar este artigo semanalmente, dependendo das necessidades do seu negócio, ou aplicar a solução escrevendo trabalhos de DELETE personalizados. (Consulte a nossa documentação CRM SDK sobre a propriedade BulkDeleteRequest.QuerySet, sobre a classe BulkDeleteRequest e sobre a ordem de supressão)

  • Certifique-se de que os registos de AssincOperation para fluxos de trabalho e os registos correspondentes são eliminados do objeto WorkflowLogBase.

  • Certifique-se de que todos os registos de operação de granel correspondentes e bulkdelete são eliminados.

  • Certifique-se de que apenas os seguintes tipos de operação Async 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 SQM (9)

    • PersistMatchCode (12)

    • FullTextCatalogIndex (25)

    • UpdateContractStates (27)

    • Fluxo de trabalho (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

Melhorar o desempenho do script de eliminação

  • Para melhorar o desempenho geral do Microsoft Dynamics CRM, agende o Microsoft Dynamics CRM Deletion Service para funcionar durante as horas de ponta para o Microsoft Dynamics CRM. Por padrão, o serviço é executado no momento em que o Microsoft Dynamics CRM foi instalado. No entanto, pode configurar o serviço para funcionar às 22:00 em vez de na hora padrão. Para isso, utilize o Microsoft Dynamics CRM ScaleGroup Job Editor. Para mais informações, visite o seguinte website codePlex:

    http://crmjobeditor.codeplex.com/Notas

    1. Esta ação não afeta diretamente o desempenho do script.

    2. O editor de emprego da Microsoft Dynamics CRM 4.0 foi despecado e já não está disponível.

  • Para melhorar o desempenho dos scripts de eliminação neste artigo e melhorar o código do Serviço de Eliminação CRM da Microsoft Dynamics que executa supressões semelhantes, adicione os seguintes três índices à 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])GOCREATE 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 o Serviço de Processamento Assíncronos da Microsoft Dynamics CRM enquanto executa este script.

  • Opcional Reconstruir os seguintes índices e atualizar 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
  • Opcional Atualizar estatísticas com verificação completa em todas as tabelas envolvidas com esta consulta utilizando os seguintes comandos (de preferência em horas de ponta):

    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
  • 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 o SQL Server 2005, inicie sessão no Microsoft SQL Server Management Studio como Administrador, clique com o botão direito na base de dados <org_name>_MSCRM, clique em Propriedades,clique em Opçõese, em seguida, clique no Modelo de Recuperação. Marque Simplese, em seguida, clique em OK. Depois de executar este script pela primeira vez, o modelo de recuperação de <org_name>_MSCRM base de dados deve ser rectado para FULL para o melhor modelo de recuperação de dados.

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

Para determinar o número de registos a eliminar pelo script deste artigo, execute o seguinte script de contagem com a 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 do scriptQuando executar o script de limpeza, poderá receber uma mensagem de erro que se assemelha ao seguinte:

A declaração da DELETE entrou em conflito com a restrição de referência "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 de WorkflowWaitSubscription que existem para fluxos de trabalho concluídos ou cancelados. Estes registos já não deveriam existir, porque deveriam ter sido suprimidos quando os fluxos de trabalho foram concluídos ou cancelados. Não deve ver nenhum registo que seja devolvido 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 UI porque o processo Microsoft CRM Async está num estado cancelado ou concluído. O seguinte script verificará quantos registos órfãos do 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 seguinte script eliminará os registos workflowWaitSubscriptionBase para registos de WorkflowWaitSubscriptionBase para registos de fluxo de trabalho concluídos e 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))

Após a execução desta declaração de eliminação, o script de limpeza assioperaçãoBase e Workflow completa-se com sucesso.

Mais Informações

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

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

957871 Os registos de tarefas 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 da atualização do software, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:

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

887283 Microsoft Business Solutions software HOTfix e atualizar pacote de padrões de nomeação

Precisa de mais ajuda?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.

As comunidades ajudam-no a colocar e a responder perguntas, a dar feedback e a ouvir especialistas com conhecimentos abrangentes.