Simptome
Atunci când rulați Microsoft Dynamics CRM 4.0, Microsoft Dynamics CRM 2011, Microsoft Dynamics CRM 2013 sau Microsoft Dynamics CRM 2015, tabelul AsyncOperationBase devine foarte mare. Atunci când tabelul conține milioane de înregistrări, performanța este lentă.
În plus, erorile care se aseamănă cu următoarele sunt înregistrate în jurnalul de evenimente al aplicației pe serverul care rulează Microsoft Dynamics CRM:
Notă
Tip eveniment: Eroare
Sursa evenimentului: MSCRMDeletionService
Categorie eveniment: Fără
Event ID: 16387
Data: 2009/01/26
Ora: 11:41:54
Utilizator: Indisponibil
Computer: CRMSERVER
Description: Error: Deletion Service failed to clean up table=CleanupInactiveWorkflowAssembliesProcedure Pentru mai multe informații, consultați Centrul de ajutor și asistență la http://go.microsoft.com/fwlink/events.asp.
Rezolvare
Pentru a rezolva această problemă, efectuați o curățare a tabelului AsyncOperationBase rulând următorul script în baza de date**<OrgName>_MSCRM, unde substituentul<OrgName>** reprezintă numele real al organizației dvs.
Avertisment Înainte de a curăța datele, rețineți că operațiunile de sistem finalizate au valoare de afaceri în unele cazuri și trebuie stocate pentru o perioadă mai lungă de timp. Prin urmare, ar trebui să discutați mai întâi acest lucru cu personalul de administrare al organizației.
Locurile de muncă de sistem care sunt afectate:
Colectarea datelor SQM. Măsurători de calitate software colectează date pentru programul experiența clienților.
Stările contractului de actualizare activitate SQL. Această activitate rulează o dată pe zi, la miezul nopții. Această activitate setează contractele expirate la starea Expirat.
Index catalog cu text complet organizație. Populează indexul de text complet în baza de date pentru căutarea în articolele din Baza de cunoștințe Microsoft în CRM.
Dacă solicitările recurente au fost anulate, acestea vor fi eliminate.
Note
Pentru Microsoft Dynamics CRM Scriptul SQL din acest articol din Baza de cunoștințe este un efort unic. Puteți adăuga aceasta ca activitate SQL care să ruleze periodic noaptea, săptămânal sau lunar. Pe măsură ce CRM-ul rulează, trebuie să aplicați acest articol săptămânal, în funcție de nevoile afacerii dvs., sau să aplicați soluția scriind activități particularizate de ȘTERGERE MASIVĂ. (Consultați documentația SDK CRM despre proprietatea BulkDeleteRequest.QuerySet, despre clasa BulkDeleteRequest și despre ordinea ștergerii)
Asigurați-vă că înregistrările AsyncOperation pentru fluxurile de lucru și înregistrările corespunzătoare sunt șterse din obiectul WorkflowLogBase.
Asigurați-vă că toate înregistrările bulkdeletefailure și bulkdeleteoperation corespunzătoare sunt șterse.
Asigurați-vă că se șterg doar următoarele tipuri de operațiuni asincrone dacă codul de stare al tipurilor este 3 și codul de stare al tipurilor este 30 sau 32:
- Activitate de extindere a fluxului de lucru (1)
- Colectare date SQM (9)
- PersistMatchCode (12)
- FullTextCatalogIndex (25)
- UpdateContractStates (27)
- Flux de lucru (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
Îmbunătățirea performanței scriptului de ștergere
Pentru a îmbunătăți performanța generală a Microsoft Dynamics CRM, programați Serviciul de ștergere Microsoft Dynamics CRM să ruleze în afara orelor de vârf pentru Microsoft Dynamics CRM. În mod implicit, serviciul rulează în momentul în care a fost instalat Microsoft Dynamics CRM. Cu toate acestea, puteți seta serviciul să ruleze la ora 22:00 în loc să ruleze la ora implicită. Pentru a face acest lucru, utilizați Editorul de activități Microsoft Dynamics CRM ScaleGroup. Pentru mai multe informații, vizitați următorul site web CodePlex:
http://crmjobeditor.codeplex.com/ Note- Această acțiune nu afectează în mod direct performanța scriptului.
- Editorul de activități pentru Microsoft Dynamics CRM 4.0 a fost descris și nu mai este disponibil.
Pentru a îmbunătăți performanța scripturilor de ștergere din acest articol și a îmbunătăți codul Microsoft Dynamics CRM Serviciu de ștergere care rulează ștergeri similare, adăugați următoarele trei indexuri la baza de date OrganizationName_MSCRM înainte de a rula scriptul de ștergere din acest articol:
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) GONotă: dacă nu adăugați aceste indexuri, rularea scriptului de ștergere poate dura câteva ore.
Opriți serviciul de procesare asincronă Microsoft Dynamics CRM în timp ce rulați acest script.
Opțional: Reconstruiți următoarele indexuri și statistici de actualizare:
-- 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) GOStatistici de actualizare opționale cu scanare completă pentru toate tabelele implicate în această interogare, utilizând următoarele comenzi (preferabil în afara orelor de vârf):
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 FULLSCANOpțional, modificați modelul de recuperare al bazei de date MSCRM la simplu pentru a evita generarea excesivă a jurnalelor Microsoft SQL Server. Pentru SQL Server 2005, conectați-vă la Microsoft SQL Server Management Studio ca administrator, faceți clic dreapta pe <baza de date org_name>_MSCRM, faceți clic pe Proprietăți, pe Opțiuni, apoi faceți clic pe Model recuperare. Mark Simple, apoi faceți clic pe OK. După ce rulați acest script prima dată, <modelul de recuperare a bazei de date org_name>_MSCRM trebuie comutat înapoi la COMPLET pentru cel mai bun model de recuperare a datelor.
Pentru a mări performanța scriptului, @DeleteRowCount valoarea de 10.000 poate fi redusă
Pentru a determina numărul de înregistrări care vor fi șterse de scriptul din acest articol, rulați următorul script de contorizare pentru baza de date 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)
Eroare de script
Atunci când rulați scriptul de curățare, este posibil să primiți un mesaj de eroare care seamănă cu următorul:
Notă
Instrucțiunea DELETE a intrat în conflict cu restricția REFERENCE "asyncoperation_workflowwaitsubscription". Conflictul a apărut în baza de date "Contoso_MSCRM", tabelul "dbo. WorkflowWaitSubscriptionBase", coloana "AsyncOperationId". Instrucțiunea a fost încheiată.
Dacă primiți acest mesaj de eroare, opriți scriptul de curățare, apoi urmați acești pași pentru a elimina înregistrările WorkflowWaitSubscription rămase pentru fluxurile de lucru finalizate sau anulate. Aceste înregistrări nu ar mai trebui să existe, deoarece ar fi trebuit șterse când fluxurile de lucru au fost finalizate sau anulate. Nu ar trebui să vedeți nicio înregistrare returnată în urma acestei interogări. Orice ce a rămas în tabelul WorkflowWaitSubscriptionBase care apare în această interogare este o înregistrare solitară. Nu puteți șterge aceste înregistrări prin interfața de utilizator, deoarece procesul Microsoft CRM asincron este într-o stare anulat sau finalizat.
Următorul script va verifica câte înregistrări solitare WorkflowWaitSubscriptionBase există pentru înregistrările de flux de lucru finalizate și anulate:
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))
Următorul script va șterge înregistrările WorkflowWaitSubscriptionBase pentru înregistrările WorkflowWaitSubscriptionBase blocate pentru înregistrările de flux de lucru finalizate și anulate:
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))
După ce este executată această instrucțiune de ștergere, AsyncoperationBase și scripturile de curățare a fluxului de lucru se vor finaliza cu succes.
Mai multe informații
Pentru mai multe informații, faceți clic pe următoarele numere de articole pentru a le vizualiza în Baza de cunoștințe Microsoft:
954929 entitatea AsyncOperation consumă o parte semnificativă din baza de date [Org]_MSCRM și provoacă performanțe slabe în Microsoft Dynamics CRM
957871 Înregistrările activități de extindere a fluxului de lucru determină creșterea prea mare a tabelului AsyncOperationBase din baza de date MSCRM în Microsoft Dynamics CRM 4.0 Pentru mai multe informații despre terminologia privind actualizarea de software, faceți clic pe următorul număr de articol pentru a vedea articolul în Baza de cunoștințe Microsoft:
824684 Descrierea terminologiei standard care este utilizată pentru a descrie actualizările de software MicrosoftPentru mai multe informații despre terminologia privind remedierile rapide și pachetele de actualizare ale software-ului Microsoft Business Solutions, faceți clic pe următorul număr de articol pentru a vedea articolul în Baza de cunoștințe Microsoft:
887283 Microsoft Business Solutions Software CRM Remedieri rapide și standarde de numire a pachetelor de actualizare