Optimering af tabellen AsyncOperationBase...hvorfor og hvordan?

Tabellen AsyncOperationBase indeholder oplysninger om Systemjobs, herunder også handlinger udført af Arbejdsprocesser (workflows), og tabellen kan vokse sig rigtig stor og derved påvirke ydelsen af SQL Serveren, og dermed også MS CRM. Dette indlæg handler om optimering af tabellen.

Dette indlæg er baseret på artiklen: Performance is slow if the AsyncOperationBase...

OBS! Backup anbefales før gennemførelse af nedenstående optimering, ligesom det anbefales ikke at gennemføre nedenstående optimering mens der er brugere på systemet, da det påvirker ydelsen af systemet og optimeringsprocessen. Sidst, men ikke mindst, bør man læse hele ovennævnte artikel, der der indgår en række forslag til hvad man kan gøre hvis forskellige situationer opstår under optimeringen.
 

Problemet

Tabellen AsyncOperationBase er en form for log, som med tiden vokser sig rigtig stor, især hvis man har mange arbejdsprocesser (workflows) kørende. Enhver hændelse omkring arbejdsprocesser bliver registreret og det fylder. Man kan antage den holdning, at når en arbejdsproces er fuldendt som en succes, er der ingen grund til at man gemmer en sådan information i årevis. Dog kan informationen være nyttig i en periode, da den jo dokumenterer en hændelse.

Jeg har netop arbejdet for en kunde som havde en organisationsdatabase (<organisation>_MSCRM), som havde en størrelse på knap 33 GB, hvor tabellen AsyncOperationBase alene fyldte godt 16 GB. Der var godt 24 millioner poster i tabellen. Tabellens størrelse påvirker ydelsen dramatisk.

En nærmere analyse viste, at ved at fjerne "unødvendige" poster kunne tabellen mindskes til ca. 300.000 poster. De såkaldt "unødvendige" poster omfatter, se også afsnittet "Om tabellen AsyncOperationBase" herunder:

  • OperationType 1: Systemhændelser
  • OperationType 9: Indsamling af data fra Customer Experience Program
  • OperationType 10: Arbejdsproces/Workflow
  • OperationType 12: Intern proces i MS CRM
  • OperationType 25: Operation, som optimerer en organisations indeks til dokumentsøgning
  • OperationType 27: Operation hvor kontrakter er blevet opdateret
  • StateCode 3: Operationen er gennemført (Completed)
  • StatusCode 30: Operationen er lykkedes (Succeeded)
  • StatusCode 32: Operationen er annulleret (Canceled)
      


Eksempel på System Jobs, som indeholder registreringer af forskellig art (System Job Type og Status Reason)

 

Løsningen

Løsningen på problemet, var at optimere tabellen AsyncOperationBase ved at slette "unødvendige" poster. Dette gøres ved brug af et SQL Server-script, som anbefales i ovennævnte Knowledge Base-artikel.

Scriptet køres på den organisationsdatabase, som indeholder den AsyncOperationBase, der skal optimeres.

IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'CRM_AsyncOperation_CleanupCompleted')
DROP INDEX AsyncOperationBase.CRM_AsyncOperation_CleanupCompleted
GO
--Create Index on AsyncOperationBase, to make operations faster
CREATE NONCLUSTERED INDEX CRM_AsyncOperation_CleanupCompleted
ON [dbo].[AsyncOperationBase] ([StatusCode],[StateCode],[OperationType])
GO
DECLARE @DeleteRowCount int
SELECT  @DeleteRowCount = 2000
DECLARE @DeletedAsyncRowsTable TABLE (AsyncOperationId UniqueIdentifier Not Null Primary Key)
DECLARE @continue int, @rowCount int
SELECT  @continue = 1
WHILE (@continue = 1)
BEGIN
  BEGIN TRAN
   INSERT INTO @DeletedAsyncRowsTable(AsyncOperationId)
   SELECT TOP (@DeleteRowCount) AsyncOperationId FROM AsyncOperationBase
    WHERE OperationType IN (1, 10, 9, 12, 25, 27) AND StateCode = 3 AND StatusCode in (30, 32)
   SELECT @rowCount = 0
   SELECT @rowCount = Count(*) FROM @DeletedAsyncRowsTable
   SELECT @continue = CASE WHEN @rowCount <= 0 THEN 0 ELSE 1 END
   IF (@continue = 1)
    BEGIN
     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 WorkflowWaitSubscriptionBase FROM WorkflowWaitSubscriptionBase WS, @DeletedAsyncRowsTable d
      WHERE WS.AsyncOperationId = d.AsyncOperationID
    
     DELETE AsyncOperationBase FROM AsyncOperationBase A, @DeletedAsyncRowsTable d
      WHERE A.AsyncOperationId = d.AsyncOperationId
    
     DELETE @DeletedAsyncRowsTable
   END
 COMMIT
END
--Drop the Index on AsyncOperationBase
DROP INDEX AsyncOperationBase.CRM_AsyncOperation_CleanupCompleted

 

Resultatet

Resultatet af optimeringen:

Scenarie 1

  • Kørslen af scriptet tog ca. 5,5 time, med sletning af ca. 4,3 millioner poster i timen.
  • Der blev slettet mere end 24 millioner poster. Der var 318.110 poster tilbage efter sletningen, herunder dem som indikerer ventende arbejdsprocesser
  • En sammenligning af forskellige forespørgsler, ved brug af Avanceret søgning, viste en forbedret ydelse på mellem 40-470%.
  • Databasen samlede størrelse, inklusive logfil, blev mindsket fra ca. 32,6 GB til 18,4 GB.

Scenarie 2

  • Kørslen af scriptet tog ca. 30,5 time, med sletning af ca. 4,9 millioner poster i timen.
  • Der blev slettet mere end 149 millioner poster. Der var 84.216 poster tilbage efter sletningen, herunder dem som indikerer ventende arbejdsprocesser
  • Databasen samlede størrelse, inklusive logfil, blev mindsket fra ca. 209 GB til 21,5 GB.

 

Om tabellen AsyncOperationBase

Tabellen AsyncOperationBase indeholder mange forskellige typer poster, som hver især fortæller hvilken form for information posten indeholder. Informationerne fordeler sig primært over 3 felter.

Feltet OperationType kategoriserer informationer.

Værdi

Benævnelse

Beskrivelse

1 Event System hændelser. Hændelser som systemet udfører internt.
2 BulkEmail Massesletning: Masseudsendelse af e-mail fra f.eks. kampagner.
3 Parse Import af data i tilstanden Parse: En tilstand hvor data overføres til MS CRM i forbindelse med import af data.
4 Transform Import af data i tilstanden Transform: En tilstand hvor data transformeres inden selve importen til MS CRM i forbindelse med import af data.
5 Import Import af data i tilstanden Import: En tilstand hvor data fysisk importeres ind i MS CRM i forbindelse med import af data.
6 ActivityPropagation Kampagneaktivitet: Aktivering af kampagneaktiviteter.
7 PublishDuplicateRule Dubletsøgning: Publicering af en regel for dubletsøgning.
8 BulkDetectDuplicates Dubletsøgning: Masseundersøgelse af dubletter.
9 CollectSqmData SQL -Software Quality Metrics: Indsamling af data fra Customer Experience Program, altså hvis man har tilladt Microsoft at få oplysninger om brugen af MS CRM (Dette indikeres under installation af MS CRM) .
10 Workflow Arbejdsproces/Workflow: Indikerer om der er tale om en arbejdsproces (workflow).
11 QuickCampaign Lynkampagne: Indikerer om der er tale om en Lynkampagne.
12 PersistMatchCode MatchCode: Intern proces i MS CRM som sammenligner forskellige id-numre for at sikre data integritet.
13 BulkDelete Massesletning: Informationer om massesletning af poster i MS CRM.
14 DeletionService Slette poster: Fysisk sletning af poster i databasen (Poster er jo kun slettemarkeret, og bliver fysisk slettet af den asynkrone service, på et givet tidspunkt.
15 IndexManagement Indeksering: Informationer om at MS CRM har indekseret poster i databasen.
16 CollectOrgStats Statistik: Opsamling af data til intern statistik.
17 ImportingFile Import: Indikerer at der er tale om en underproces til dataimport.
18 CalculateOrgStorageSize Beregning af datastørrelse: Beregner størrelsen på hver oaganisations database.
19 CollectOrgDBStats Statistik: Opsamler og beregner statistik om databasen for hver organisation.
20 CollectOrgSizeStats Statistik: Opsamler og beregner statistik om databasen for hver organisation, og organisationens størrelse.
21 DatabaseTuning Optimering af database: Operation hvor databasen er blevet optimeret.
22 CalculateOrgMaxStorageSize Beregning: Beregner den maksimale størrelse på en organisations database.
23 BulkDeleteChild Massesletning: Information om underordnet job til massesletning.
24 UpdateStatisticIntervals Statistik: Interval for opsamling af statistik.
25 FullTextCatalogIndex Indeksering: Operation, som optimerer en organisations indeks til dokumentsøgning (full text catalog).
26 DatabaseLogBackup Backup: Opsamler informationer om tidspunkt hvor informationer er ført til log i databasen.
27 UpdateContractStates Kontrakter: Operation hvor kontrakter er blevet opdateret (ofte for at indikerer at disse er udløbet eller ej).
28 ShrinkDatabase Optimering: Information om optimering af MS CRM-databasen.
29 ShrinkLogFile Optimering: Informationer om optimering af MS CRM-databasens logfil.
30 ReindexAll Optimering: Informationer om reindeksering af indeks i databasen.
31 StorageLimitNotification Dataplads: Informationer om databasen har nået en størrelse hvor den kan løbe tør for plads (fysisk eller licensmæssigt).
32 CleanupInactiveWorkflowAssemblies Arbejdsprocesser: Fjernelse af inaktive arbejdsprocesser (workflows).
38 ImportSampleData Import: Information om import at eksempeldata.

Felterne StateCode og StatusCode indikerer hvilken status og tilstand en operation er i.

StateCode værdi StateCode StatusCode værdi StatusCode
0 Ready 0 WaitingForResources
1 Suspended 10 Waiting
2 Locked 20 InProgress
2 Locked 21 Pausing
2 Locked 22 Canceling
3 Completed 30 Succeeded
3 Completed 31 Failed
3 Completed 32 Canceled

 

Yderligere informationer

Du kan læse mere om emner i dette indlæg på følgende sider:

Grundlag for dette indlæg (Engelsk): Performance is slow if the AsyncOperationBase...
Indlæg om indstillinger i registreringsdatabasen (Engelsk)
: AsyncOperationBase and WorkflowLogBase tables grow...
Indlæg om indstillinger i registreringsdatabasen (Engelsk): Workflow Expansion Task records cause the AsyncOperationBase table to grow...

Bliv medlem af CRMUG DK

De regionale afdelinger i CRMUG giver mulighed for a mødes med andre medlemmer af CRMUG i dit lokalområde. Hermed får du mulighed for at mødes ansigt til ansigt og vidensdele med andre brugere af Microsoft Dynamics CRM i dit område.

Læs mere den Danske afdeling af CRMUG...

Om Henrik Jensen

Jeg har altid fingeren på pulsen når det drejer sig om Microsofts produkter & teknologier, og især når det handler om Microsoft Dynamics CRM.

Henrik Jensen

Jeg har arbejdet professionelt i IT-branchen mere end 25 års, deraf mere end 18 år med CRM-systemer, og samtidig indehaver af mere end 50 Microsoft-certificeringer.

Mobil: +45 20 300 300
E-mail: hj@easyconsult.dk

EASYConsult ApS

Læs mere...

Downloads, værktøjer, installation og JScript

Downloade komponenter til MS CRM:
    • Microsoft Dynamics CRM 4.0
    • Microsoft Dynamics CRM 2011
    • Microsoft Dynamics CRM 2013
    • Microsoft Dynamics CRM 2015
    • Microsoft Dynamics CRM 2016

Liste over Opdateringspakker (Rollups):
    • Microsoft Dynamics CRM 4.0
    • Microsoft Dynamics CRM 2011
    • Microsoft Dynamics CRM 2013
    • Microsoft Dynamics CRM 2015
    • Microsoft Dynamics CRM 2016

Værktøjer til MS CRM:
    • Liste med værktøjer til MS CRM

Krav og opsætninger til installation:
    • Krav og opsætninger MS CRM 2011
    • Krav og opsætninger MS CRM 2013
    • Krav og opsætninger MS CRM 2015
    • Krav og opsætninger MS CRM 2016

JScript eksempelkode:
    • Javascript API-reference
    • Javascript eksempelkode

Diverse værktøjer:
    • Sysinternals
    • PowerShell og MS CRM 2011

Visual Studio, SSIS og Kingswaysoft
    • Visual Studio 2017
    • Dataværktøjer (SSIS) 2017
    • Kingswaysoft

Månedsliste

Forbehold

Alt hvad du læser på denne blog er alene udtryk for mine egne holdninger og meninger, og kan ikke henføres til andet end som så.

De løsninger jeg fremstiller på denne blog er ikke nødvendigvis testet i et driftsmiljø. Hvis du gør brug af mine løsninger er det på eget ansvar.