Ознаки
Під час запуску 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
Опис: Помилка: службі видалення не вдалося очистити таблицю=CleanupInactiveWorkflowAssembliesProcedure Для отримання додаткових відомостей див. центр довідки та підтримки на http://go.microsoft.com/fwlink/events.asp.
Спосіб усунення проблеми
Щоб вирішити цю проблему, виконайте очищення таблиці AsyncOperationBase, виконавши наведений нижче сценарій із базою даних _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, а не в стандартний час. Для цього скористайтеся редактором завдань ScaleGroup Microsoft Dynamics CRM ScaleGroup. Щоб отримати додаткові відомості відвідайте такий веб-сайт CodePlex:
http://crmjobeditor.codeplex.com/ Нотатки- Ця дія безпосередньо не впливає на виконання сценарію.
- Редактор завдань для 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 базу даних, виберіть пункт Властивості, натисніть кнопку Параметри, а потім виберіть модель відновлення. Виберіть пункт Простий і натисніть кнопку 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 перебуває в стані скасування або завершення.
Наведений нижче сценарій перевірить кількість загублених записів 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 і workflow cleanup буде успішно завершено.
Додаткові відомості
Щоб отримати додаткові відомості, клацніть номер статті в базі знань база знань Microsoft:
954929 сутність AsyncOperation використовує значну частину [Org]_MSCRM бази даних і призводить до зниження продуктивності в Microsoft Dynamics CRM
957871 Через записи завдання розширення робочого циклу таблиця AsyncOperationBase бази даних MSCRM завелика в Microsoft Dynamics CRM 4.0. Щоб отримати додаткові відомості про термінологію оновлення програмного забезпечення, клацніть номер статті в базі знань база знань Microsoft:
824684 Опис стандартної термінології, яка використовується для опису оновлень програмного забезпечення Microsoft Щоб отримати додаткові відомості про термінологію програмного забезпечення та оновлення програмного забезпечення Microsoft Business Solutions CRM, клацніть номер статті в базі знань база знань Microsoft:
887283 програмне забезпечення Microsoft Business Solutions CRM виправлення та оновлення пакет іменування стандартів