Performanse su spore ako tabela AsyncOperationBase postane prevelika u sistemu Microsoft Dynamics CRM

Primenjuje se na
Dynamics CRM 4.0 Microsoft Dynamics CRM 2011 Dynamics CRM 2013 Dynamics CRM 2015

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

    1. Ova radnja ne utiče direktno na performanse skripte.
    2. 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)
    GO
    
    

    Napomena: 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)
    
    GO
    
  • Opcionalno 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 FULLSCAN
    
  • Opcionalno: 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