Производителността е бавна, ако таблицата AsyncOperationBase стане твърде голяма в Microsoft Dynamics CRM

Отнася се за
Dynamics CRM 4.0 Microsoft Dynamics CRM 2011 Dynamics CRM 2013 Dynamics CRM 2015

Симптоми

Когато стартирате Microsoft Dynamics CRM 4.0, Microsoft Dynamics CRM 2011, Microsoft Dynamics CRM 2013 или Microsoft Dynamics CRM 2015, таблицата AsyncOperationBase става много голяма. Когато таблицата съдържа милиони записи, производителността е бавна.

Освен това грешките, които наподобяват посочените по-долу, се регистрират в регистъра на събитията на приложението на сървъра, на който се изпълнява Microsoft Dynamics CRM:

Забележка

Тип на събитието: Грешка

Източник на събитие: MSCRMDeletionService

Категория на събитието: Няма

Идентификатор на събитие: 16387

Дата: 2009/01/26

Час: 11:41:54 ч.

Потребител: Няма

Компютър: CRMSERVER

Описание: Грешка: Услугата за изтриване не успя да почисти table=CleanupInactiveWorkflowAssemblyiesProcedure За повече информация вижте центъра за помощ и поддръжка на http://go.microsoft.com/fwlink/events.asp.

Решение

За да отстраните този проблем, извършете почистване на таблицата AsyncOperationBase, като изпълните следния скрипт за базата данни **<OrgName>_MSCRM, където контейнерът<OrgName>** представлява точното име на вашата организация.

Предупреждение: Преди да изчистите данните, имайте предвид, че изпълнените задания на системата имат търговска стойност в някои случаи и трябва да се съхраняват за дълъг период от време. Затова трябва първо да обсъдите този въпрос с административния персонал на вашата организация.

Системни задачи, които са засегнати:

  • Събиране на SQM данни. Метриките за качество на софтуера събират данни за програмата за обслужване от клиентите.

  • Актуализиране на състоянията на договора SQL задание. Тази задача се изпълнява веднъж на ден в полунощ. Това задание задава изтеклите договори в състояние на изтекъл срок.

  • Пълнотекстов индекс на каталога на организацията. Попълва индекс на пълен текст в базата данни за търсене на статии от базата знания на Microsoft в CRM.

Ако повтарящите се задания са били отменени, те ще бъдат премахнати.

Бележки

  • За Microsoft Dynamics CRM SQL скриптът в тази статия от базата знания изисква само еднократно усилие. Можете да добавите това като SQL задача, която да се изпълнява периодично на нощна, седмична или месечна база. Докато CRM се изпълнява, трябва или да прилагате тази статия ежеседмично, в зависимост от нуждите на вашия бизнес, или да приложите решението, като напишете персонализирани задания за ГРУПОВО ИЗТРИВАНЕ. (Вижте нашата документация за CRM SDK за свойството BulkDeleteRequest.QuerySet, за класа BulkDeleteRequest и за реда на изтриване)

  • Уверете се, че записите AsyncOperation за работните потоци и съответните записи са изтрити от обекта WorkflowLogBase.

  • Уверете се, че всички съответни записи на bulkdeletefailure и bulkdeleteoperation са изтрити.

  • Уверете се, че само следните типове Async операции се изтриват, ако кодът на състоянието на типовете е 3 и кодът на състоянието на типовете е 30 или 32:

    • Задача за разширяване на работния поток (1)
    • Събиране на SQM данни (9)
    • PersistMatchCode (12)
    • FullTextCatalogIndex (25)
    • UpdateContractStates (27)
    • Работен поток (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

        
      

Подобряване на производителността на скрипта за изтриване

  • За да подобрите цялостната производителност на Microsoft Dynamics CRM, планирайте услугата за изтриване на Microsoft Dynamics CRM да се изпълнява в ненатоварените часове за Microsoft Dynamics CRM. По подразбиране услугата се изпълнява по времето, когато е инсталиран Microsoft Dynamics CRM. Можете обаче да настроите услугата да работи в 22:00 часа, вместо по подразбиране. За целта използвайте редактора на задания на Microsoft Dynamics CRM ScaleGroup. За повече информация посетете следния уеб сайт на CodePlex:
    http://crmjobeditor.codeplex.com/ Бележки

    1. Това действие не влияе пряко върху изпълнението на скрипта.
    2. Редакторът на задания за Microsoft Dynamics CRM 4.0 е изчистен и вече не е наличен.
  • За да подобрите производителността на скриптовете за изтриване в тази статия и да подобрите кода на услугата за изтриване на Microsoft Dynamics CRM, който изпълнява подобни изтривания, добавете следните три индекса към базата данни на OrganizationName_MSCRM, преди да изпълните скрипта за изтриване в тази статия:

    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
    
    

    Забележка: Ако не добавите тези индекси, изпълнението на скрипта за изтриване може да отнеме часове.

  • Спрете услугата за асинхронна обработка на Microsoft Dynamics CRM, докато изпълнявате този скрипт.

  • По желание Създайте отново следните индекси и актуализирайте статистиката:

    -- 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
    
  • По желание Актуализирайте статистиката с пълно сканиране на всички таблици, които са включени в тази заявка, с помощта на следните команди (за предпочитане извън пиковите часове):

    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
    
  • Опционално: Променете модела за възстановяване на базата данни MSCRM на "Опростен", за да избегнете излишно генериране на регистрационни файлове на Microsoft SQL Server. За SQL Server 2005 влезте в Microsoft SQL Server Management Studio като администратор, щракнете с десния бутон върху базата <данни на org_name>_MSCRM, щракнете върху "Свойства", щракнете върху "Опции" и след това щракнете върху "Модел за възстановяване". Маркирайте Simple и след това щракнете върху OK. След като изпълните този скрипт за първи път, моделът <за възстановяване на org_name>_MSCRM база данни трябва да бъде върнат на "ПЪЛЕН" за най-добър модел за възстановяване на данните.

  • За да се увеличи производителността на скрипта, стойността @DeleteRowCount от 10 000 може да бъде намалена

            
За да определите броя на записите, които трябва да бъдат изтрити от скрипта в тази статия, изпълнете следния скрипт за преброяване за базата данни на 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) 

Грешка в скрипт

Когато изпълните скрипта за почистване, може да получите съобщение за грешка, което е подобно на следното:

Забележка

Командата DELETE е в конфликт с ограничението REFERENCE "asyncoperation_workflowwaitsubscription". Конфликтът е възникнал в база данни "Contoso_MSCRM", таблица "dbo. WorkflowWaitSubscriptionBase", колона "AsyncOperationId". Командата е прекратена.

            
Ако получите това съобщение за грешка, спрете скрипта за почистване и след това следвайте тези стъпки, за да премахнете останалите записи на WorkflowWaitSubscription, които съществуват за завършените или отменените работни потоци. Тези записи не би трябвало вече да съществуват, защото е трябвало да са изтрити, когато работните потоци са били завършени или отменени. Не би трябвало да видите никакви записи, върнати от тази заявка. Всичко, което е останало в таблицата WorkflowWaitSubscriptionBase, което се появява в тази заявка, е изолиран запис. Не можете да изтриете тези записи чрез потребителския интерфейс, защото процесът на Microsoft CRM Async е в отменено или завършено състояние.

Следващият скрипт ще провери колко осиротели записи на WorkflowWaitSubscriptionBase съществуват за завършени и отменени записи на работен поток:

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)) 

Следващият скрипт ще изтрие WorkflowWaitSubscriptionBase записи за блокирани WorkflowWaitSubscriptionBase записи за завършени и отменени записи на работен поток:

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))

След като тази команда за изтриване се изпълни, скриптът за изчистване на AsyncoperationBase и работния поток ще завършат успешно.

Повече информация

За повече информация щракнете върху номерата на следната статия, за да ги прегледате в базата знания на Microsoft:

954929 Обектът AsyncOperation заема значителна част от базата данни [Org]_MSCRM и причинява ниска производителност в Microsoft Dynamics CRM

957871 Записите за задача за разширяване на работния поток причиняват твърде голямо нарастване на таблицата AsyncOperationBase в базата данни MSCRM в Microsoft Dynamics CRM 4.0 За повече информация относно терминологията за софтуерни актуализации щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

824684 Описание на стандартната терминология, която се използва за описание на софтуерните актуализации на Microsoft За повече информация относно терминологията за горещи поправки и пакети за актуализации на софтуера Microsoft Business Solutions щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

887283 Microsoft Business Solutions Стандарти за актуална поправка и именуване на пакети за актуализации