Veiktspēja ir lēna, ja tabula AsyncOperationBase kļūst pārāk liela programmā Microsoft Dynamics CRM

Attiecas uz
Dynamics CRM 4.0 Microsoft Dynamics CRM 2011 Dynamics CRM 2013 Dynamics CRM 2015

Pazīmes

Palaižot Microsoft Dynamics CRM 4.0, Microsoft Dynamics CRM 2011, Microsoft Dynamics CRM 2013 vai Microsoft Dynamics CRM 2015, tabula AsyncOperationBase kļūst ļoti liela. Ja tabulā ir miljoniem ierakstu, veiktspēja ir lēna.

Turklāt kļūdas, kas līdzīgas šīm, tiek reģistrētas lietojumprogrammas notikumu žurnālā serverī, kurā darbojas Microsoft Dynamics CRM:

Piezīme

Notikuma tips: Kļūda

Notikuma avots: MSCRMDeletionService

Notikuma kategorija: Nav

Notikuma ID: 16387

Datums: 2009/01/26

Laiks: 11:41:54

Lietotājs: Neattiecas

Dators: CRMSERVER

Apraksts: Kļūda: dzēšanas pakalpojumam neizdevās iztīrīt table=CleanupInactiveWorkflowAssembliesProcedure Papildinformāciju skatiet palīdzības un atbalsta centrā vietnē http://go.microsoft.com/fwlink/events.asp.

Risinājums

Lai novērstu šo problēmu, veiciet tabulas AsyncOperationBase tīrīšanu, palaižot tālāk norādīto skriptu datu bāzē**<OrgName>_MSCRM, kur vietturis<OrgName>** norāda faktisko jūsu organizācijas nosaukumu.

Brīdinājums Pirms datu tīrīšanas ņemiet vērā, ka pabeigtajiem sistēmas darbiem dažos gadījumos ir biznesa vērtība, un tie ir jāglabā ilgu laika periodu. Tāpēc vispirms tas jāapspriež ar organizācijas administrācijas darbiniekiem.

Ietekmētie sistēmas darbi:

  • SQM datu apkopošana. Programmatūras kvalitātes metrika apkopo datus klientu pieredzes programmai.

  • Atjaunināt līguma stāvokļus SQL darbs. Šis darbs tiek izpildīts vienu reizi dienā pusnaktī. Šis darbs iestata līgumus, kuriem beidzies derīgums, pozīcijā Beidzies derīgums.

  • Organizācijas pilna teksta kataloga indekss. Aizpilda pilna teksta indeksu datubāzē, lai meklētu Microsoft zināšanu bāzes rakstus CRM.

Ja periodiskie darbi tika atcelti, tie tiks noņemti.

Piezīmes

  • Pakalpojumam Microsoft Dynamics CRM SQL skripts šajā zināšanu bāzes rakstā ir tikai vienreizējs darbs. Varat pievienot to kā SQL darbu izpildei periodiski katru nakts, nedēļu vai mēnesi. Kad jūsu CRM darbojas, jums šis raksts ir jālieto katru nedēļu atkarībā no jūsu biznesa vajadzībām vai jāpiemēro risinājums, rakstot pielāgotus lielapjoma dzēšanas darbus. (Skatiet mūsu CRM SDK dokumentāciju par rekvizītu BulkDeleteRequest.QuerySet, par BulkDeleteRequest klasi un dzēšanas secību)

  • Pārliecinieties, vai AsyncOperation ieraksti darbplūsmām un atbilstošie ieraksti tiek izdzēsti no objekta WorkflowLogBase.

  • Pārliecinieties, vai visi atbilstošie BulkDeleteFailure un BulkDeleteOperation ieraksti ir izdzēsti.

  • Ja tipu stāvokļa kods ir 3 un tipu statusa kods ir 30 vai 32, pārliecinieties, vai tiek izdzēsti tikai tālāk norādītie asinhrono operāciju tipi.

    • Darbplūsmas paplašināšanas uzdevums (1)
    • Apkopot SQM datus (9)
    • PersistMatchCode (12)
    • FullTextCatalogIndex (25)
    • UpdateContractStates (27)
    • Darbplūsma (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

        
      

Dzēšanas skripta veiktspējas uzlabošana

  • Lai uzlabotu kopējo Microsoft Dynamics CRM veiktspēju, ieplānojiet Microsoft Dynamics CRM dzēšanas pakalpojuma palaišanu Microsoft Dynamics CRM laikā, kad tas ir ārpus noslogotā. Pēc noklusējuma pakalpojums darbojas laikā, kad tika instalēts Microsoft Dynamics CRM. Tomēr varat iestatīt, lai pakalpojums darbotos plkst. 22:00, nevis noklusējuma laikā. Lai to izdarītu, izmantojiet Microsoft Dynamics CRM ScaleGroup darbu redaktoru. Lai iegūtu vairāk informācijas, apmeklējiet šo CodePlex vietni:
    http://crmjobeditor.codeplex.com/ Piezīmes

    1. Šī darbība tieši neietekmē skripta veiktspēju.
    2. Microsoft Dynamics CRM 4.0 darba redaktors ir novecojis un vairs nav pieejams.
  • Lai uzlabotu šajā rakstā minēto dzēšanas skriptu veiktspēju un uzlabotu Microsoft Dynamics CRM dzēšanas pakalpojuma kodu, kas veic līdzīgas dzēšanas, pirms šajā rakstā minētā dzēšanas skripta izpildes OrganizationName_MSCRM datu bāzei pievienojiet tālāk norādītos trīs indeksus.

    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
    
    

    Piezīme Ja nepievienosit šos indeksus, dzēšanas skripta izpilde var ilgt vairākas stundas.

  • Apturiet Microsoft Dynamics CRM asinhronās apstrādes pakalpojumu, kamēr izpildāt šo skriptu.

  • Neobligāti: no jauna izveidojiet tālāk norādītos indeksus un atjauniniet 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
    
  • Neobligāta statistikas atjaunināšana ar pilno skenēšanu visām tabulām, kas ir iesaistītas šajā vaicājumā, izmantojot tālāk norādītās komandas (vēlams mazāk noslogotajā laikā):

    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
    
  • Neobligāts Mainiet MSCRM datu bāzes atkopšanas modeli uz Vienkāršs, lai izvairītos no pārmērīgas Microsoft SQL Server žurnālu ģenerēšanas. Attiecībā uz SQL Server 2005, piesakieties Microsoft SQL Server Management Studio kā administrators, ar peles labo pogu noklikšķiniet uz org_name<>_MSCRM datu bāzes, noklikšķiniet uz Rekvizīti, noklikšķiniet uz Opcijas un pēc tam noklikšķiniet uz Atkopšanas modelis. Atzīmējiet Vienkārši un pēc tam noklikšķiniet uz Labi. Kad pirmoreiz palaižat šo skriptu, org_name>_MSCRM datu bāzes atkopšanas <modelis ir jāpārslēdz atpakaļ uz FULL, lai iegūtu labāko datu atkopšanas modeli.

  • Lai palielinātu skripta veiktspēju, @DeleteRowCount vērtību 10 000 var samazināt

            
Lai noteiktu, cik ierakstus skripts šajā rakstā dzēš, OrganizationName_MSCRM datu bāzē izpildiet tālāk norādīto skaita skriptu.


Select Count(AsyncOperationId)from AsyncOperationBase WITH (NOLOCK)
where OperationType in (1, 9, 12, 25, 27, 10) 
AND StateCode = 3 AND StatusCode IN (30,32) 

Skripta kļūda

Palaižot tīrīšanas skriptu, var tikt parādīts tālāk redzamajam līdzīgs kļūdas ziņojums.

Piezīme

Priekšraksts DELETE konfliktēja ar REFERENCE ierobežojumu "asyncoperation_workflowwaitsubscription". Konflikts radās datu bāzē "Contoso_MSCRM", tabulā "dbo. WorkflowWaitSubscriptionBase", kolonna "AsyncOperationId". Paziņojums ir izbeigts.

            
Ja saņemat šo kļūdas ziņojumu, apturiet tīrīšanas skriptu un pēc tam veiciet šīs darbības, lai noņemtu atlikušos pabeigtajām vai atceltajām darbplūsmām esošos WorkflowWaitSubscription ierakstus. Šiem ierakstiem vairs nevajadzētu pastāvēt, jo tiem vajadzētu būt izdzēstiem pēc darbplūsmu pabeigšanas vai atcelšanas. No šī vaicājuma atgrieztajiem ierakstiem nevajadzētu būt redzamiem. Viss, kas paliek tabulā WorkflowWaitSubscriptionBase, kas tiek parādīts šajā vaicājumā, ir pamestais ieraksts. Šos ierakstus nevar izdzēst, izmantojot lietotāja interfeisu, jo Microsoft CRM sinhronizācijas process ir atcelts vai pabeigts.

Tālāk redzamais skripts pārbaudīs, cik ir pabeigto un atcelto darbplūsmas ierakstu WorkflowWaitSubscriptionBase bāzes:

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

Tālāk minētais skripts izdzēsīs WorkflowWaitSubscriptionBase ierakstus dzienotiem WorkflowWaitSubscriptionBase ierakstiem pabeigtajiem un atceltajiem darbplūsmas ierakstiem:

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

Pēc šī dzēšanas priekšraksta izpildes AsyncoperationBase un darbplūsmas tīrīšanas skripts tiks sekmīgi pabeigts.

Papildinformācija

Lai iegūtu papildinformāciju, noklikšķiniet uz tālāk norādītā raksta numura un lasiet Microsoft zināšanu bāzes rakstus:

954929 Entītija AsyncOperation patērē ievērojamu daļu no datu bāzes [Org]_MSCRM un izraisa sliktu veiktspēju programmā Microsoft Dynamics CRM

957871 Darbplūsmas paplašināšanas uzdevumu ierakstu dēļ MSCRM datu bāzes tabula AsyncOperationBase tiek palielināta pārāk lielā Microsoft Dynamics CRM 4.0 Lai iegūtu papildinformāciju par programmatūras atjaunināšanas terminoloģiju, noklikšķiniet uz tālāk norādītā raksta numura un lasiet Microsoft zināšanu bāzes rakstu:

824684 Standarta terminoloģijas apraksts, kas tiek izmantots Microsoft programmatūras atjauninājumu aprakstīšanaiLai iegūtu papildinformāciju par Microsoft Business Solutions CRM programmatūras labojumfailu un atjauninājumu pakotnes terminoloģiju, noklikšķiniet uz tālāk norādītā raksta numura un lasiet Microsoft zināšanu bāzes rakstu:

887283 Microsoft Business Solutions CRM programmatūras labojumfailu un atjauninājumu pakotņu nosaukumdošanas standarti