Simptomi
Kada pokrenete Microsoft Dynamics CRM 4.0, Microsoft Dynamics CRM 2011, Microsoft Dynamics CRM 2013 ili Microsoft Dynamics CRM 2015, tabela AsyncOperationBase raste do veoma velike. Kada tabela sadrži milione zapisa, performanse su spore.
Pored toga, greške slične sledećim evidentiraju se u evidenciji događaja aplikacije na serveru na kojem je pokrenut Microsoft Dynamics CRM:
Napomena
Tip događaja: Greška
Izvor događaja: MSCRMDeletionService
Kategorija događaja: Nijedan
ID događaja: 16387
Datum: 26.01.2009.
Vreme: 11:41:54 pre podne
Korisnik: Nije primenljivo
Računar: CRMSERVER
Opis: Greška: Usluga brisanja nije uspela da očisti tabelu=CleanupInactiveWorkflowAssembliesProcedure Više informacija potražite u centru za pomoć i podršku na lokaciji http://go.microsoft.com/fwlink/events.asp.
Rešenje
Da biste rešili ovaj problem, izvršite čišćenje tabele AsyncOperationBase tako što ćete pokrenuti sledeću skriptu u bazi< podataka**OrgName>_MSCRM, gde čuvar<mesta "OrgName>** predstavlja stvarno ime organizacije.
Upozorenje Pre nego što očistite podatke, imajte na umu da dovršeni sistemski zadaci u nekim slučajevima imaju poslovnu vrednost i moraju da se čuvaju tokom dužeg perioda. Stoga bi prvo trebalo da o ovome razgovarate sa administrativnim osobljem organizacije.
Sistemski poslovi na koje to utiče:
SQM prikupljanje podataka. Metrika kvaliteta softvera prikuplja podatke za program korisničkog iskustva.
Ažuriranje stanja ugovora SQL zadatak. Ovaj posao se pokreće jednom dnevno u ponoć. Ovaj zadatak postavlja istekle ugovore u stanje "Istekli".
Indeks kataloga kompletnog teksta organizacije. Popunjava indeks kompletnog teksta u bazi podataka za pretraživanje članaka Microsoft baze znanja u CRM-u.
Ako su periodični zadaci otkazani, biće uklonjeni.
Beleške
Za Microsoft Dynamics CRM SQL skripta u ovom članku u bazi znanja predstavlja samo jednokratni napor. Možete da ga dodate kao SQL zadatak koji će se pokretati periodično noću, sedmično ili mesečno. Kako se CRM pokreće, morate da primenjujete ovaj članak nedeljno, u zavisnosti od vaših poslovnih potreba, ili da primenite rešenje pisanjem prilagođenih MASOVNIH BRISANJA zadataka. (Pogledajte dokumentaciju za CRM SDK o svojstvu BulkDeleteRequest.QuerySet, o klasi BulkDeleteRequest i o redosledu brisanja)
Uverite se da se zapisi AsyncOperation za tokove posla i odgovarajući zapisi brišu iz objekta WorkflowLogBase.
Uverite se da su izbrisani svi odgovarajući zapisi BulkdeleteFailure i BulkDeleteOperation.
Uverite se da se brišu samo sledeći tipovi asinhronizacionih operacija ako je kôd stanja tipova 3 a šifra statusa tipova 30 ili 32:
- Zadatak proširenja toka posla (1)
- Prikupljanje SQM podataka (9)
- PersistMatchCode (12)
- FullTextCatalogIndex (25)
- UpdateContractStates (27)
- Tok posla (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
Poboljšavanje performansi skripte za brisanje
Da biste poboljšali ukupne performanse Microsoft Dynamics CRM-a, zakažite da se usluga brisanja Microsoft Dynamics CRM-a pokreće tokom časova manjeg opterećenja za Microsoft Dynamics CRM. Podrazumevano, usluga se pokreće u vreme kada je Microsoft Dynamics CRM instaliran. Međutim, možete da podesite da se usluga pokreće u 22:00 umesto u podrazumevano vreme. Da biste to uradili, koristite Microsoft Dynamics CRM ScaleGroup uređivač zadataka. Za više informacija, posetite sledeći CodePlex sajt:
http://crmjobeditor.codeplex.com/ Napomene- Ova radnja ne utiče direktno na performanse skripte.
- Uređivač posla za Microsoft Dynamics CRM 4.0 je dešifrovan i više nije dostupan.
Da biste poboljšali performanse skripti za brisanje u ovom članku i da biste poboljšali kôd usluge Microsoft Dynamics CRM brisanja koji pokreće slična brisanja, dodajte sledeća tri indeksa u OrganizationName_MSCRM bazu podataka pre pokretanja skripte za brisanje u ovom članku:
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) GONapomena: Ako ne dodate ove indekse, pokretanje skripte za brisanje može trajati satima.
Zaustavite uslugu asinhrone obrade Microsoft Dynamics CRM dok pokrećete ovu skriptu.
Opcionalno: Ponovo napravite sledeće indekse i ažurirajte statistiku:
-- 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) GOOpcionalno ažuriranje statistike sa potpunim skeniranjem svih tabela koje su uključene u ovaj upit pomoću sledećih komandi (po mogućstvu van intenzivnog korišćenja):
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 FULLSCANOpcionalno: Promenite model oporavka MSCRM baze podataka u "Jednostavno" kako biste izbegli prekomerno generisanje Microsoft SQL Server evidencija. Za SQL Server 2005, prijavite se u Microsoft SQL Server Management Studio kao administrator, kliknite desnim tasterom miša na org_name>_MSCRM bazu podataka, izaberite stavku< "Svojstva", kliknite na "Opcije", a zatim kliknite na model oporavka. Mark Simple, and then click OK. Kada prvi put pokrenete ovu skriptu <, trebalo bi da se org_name>_MSCRM model oporavka baze podataka vrati na vrednost FULL za najbolji model oporavka podataka.
Da biste povećali performanse skripte, @DeleteRowCount vrednost od 10.000 može da se smanji
Da biste odredili broj zapisa koje treba da izbriše skripta u ovom članku, pokrenite sledeću skriptu za brojanje u OrganizationName_MSCRM bazi podataka:
Select Count(AsyncOperationId)from AsyncOperationBase WITH (NOLOCK)
where OperationType in (1, 9, 12, 25, 27, 10)
AND StateCode = 3 AND StatusCode IN (30,32)
Greška u skripti
Kada pokrenete skriptu za čišćenje, možete dobiti poruku o grešci koja podseća na sledeću poruku:
Napomena
Instrukcija DELETE nije bila usaglašena sa ograničenjem REFERENCE "asyncoperation_workflowwaitsubscription". Došlo je do neusaglašenosti u bazi podataka "Contoso_MSCRM", tabeli "dbo. WorkflowWaitSubscriptionBase", kolona "AsyncOperationId". Izjava je obustavljena.
Ako dobijete ovu poruku o grešci, zaustavite skriptu za čišćenje, a zatim sledite ove korake da biste uklonili preostale zapise "WorkflowWaitSubscription" koji postoje za dovršene ili otkazane tokove posla. Ovi zapisi više ne bi trebalo da postoje jer je trebalo da budu izbrisani kada su tokovi posla dovršeni ili otkazani. Ne bi trebalo da vidite nijedan zapis koji je vratio ovaj upit. Sve što je ostalo u tabeli "WorkflowWaitSubscriptionBase" koja se pojavi u ovom upitu predstavlja zapis koji je siroče. Ne možete da izbrišete ove zapise putem korisničkog interfejsa jer je Microsoft CRM Async proces u otkazanom ili dovršenom stanju.
Sledeća skripta će potvrditi koliko napuštenih WorkflowWaitSubscriptionBase zapisa postoji za dovršene i otkazane zapise toka posla:
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))
Sledeća skripta će izbrisati WorkflowWaitSubscriptionBase zapise za nasukane WorkflowWaitSubscriptionBase zapise za dovršene i otkazane zapise toka posla:
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))
Kada se izvrši ova izjava o brisanju, skripta za AsyncoperationBase i Workflow cleanup uspešno će se dovršiti.
Više informacija
Više informacija potražite u sledećim brojevima članaka da biste videli te članke u Microsoft bazi znanja:
954929 Entitet AsyncOperation koristi značajan deo baze podataka [Org]_MSCRM i uzrokuje loše performanse u Microsoft Dynamics CRM
957871 Zapisi zadatka proširenja toka posla uzrokuju preveliku tabelu "AsyncOperationBase" u MSCRM bazi podataka u Microsoft Dynamics CRM 4.0 Više informacija o terminologiji ažuriranja softvera potražite u sledećem broju članka da biste videli članak u Microsoft bazi znanja:
824684 Opis standardne terminologije koja se koristi za opisivanje Microsoft softverskih ispravkiZa više informacija o Microsoft poslovnim rešenjima Terminologija paketa hitnih ispravki i ažuriranja CRM softvera, kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:
887283 Microsoft Business Solutions CRM softver hitne ispravke i ažuriranje standarda imenovanja paketa