Ydeevnen er langsom, hvis AsyncOperationBase-tabellen bliver for stor i Microsoft Dynamics CRM

Gælder for
Dynamics CRM 4.0 Microsoft Dynamics CRM 2011 Dynamics CRM 2013 Dynamics CRM 2015

Symptomer

Når du kører Microsoft Dynamics CRM 4.0, Microsoft Dynamics CRM 2011, Microsoft Dynamics CRM 2013 eller Microsoft Dynamics CRM 2015, vokser tabellen AsyncOperationBase til at være meget stor. Når tabellen indeholder millioner af poster, er ydeevnen langsom.

Desuden logføres fejl, der ligner følgende, i programhændelsesloggen på den server, der kører Microsoft Dynamics CRM:

Bemærk

Hændelsestype: Fejl

Hændelseskilde: MSCRMDeletionService

Hændelseskategori: Ingen

Hændelses-id: 16387

Dato: 26-01-2009

Klokkeslæt: 11:41:54

Bruger: I/T

Computer: CRMSERVER

Beskrivelse: Fejl: Sletningstjenesten kunne ikke rydde op i table=CleanupInactiveWorkflowAssembliesProcedure Du kan finde flere oplysninger i Hjælp og support på http://go.microsoft.com/fwlink/events.asp.

Løsning

Du kan løse dette problem ved at udføre en oprydning af tabellen AsyncOperationBase ved at køre følgende script mod databasen**<OrgName>_MSCRM, hvor pladsholderen<OrgName>** repræsenterer det faktiske navn på organisationen.

Advarsel! Før du rydder op i dataene, skal du være opmærksom på, at fuldførte systemjob i nogle tilfælde har forretningsværdi og skal gemmes i lang tid. Derfor bør du først diskutere dette med organisationens administration.

Systemjob, der påvirkes:

  • Indsamling af SQM-data. Målepunkter for softwarekvalitet indsamler data til kundeoplevelsesprogrammet.

  • Opdater Contract States SQL-job. Dette job kører én gang om dagen ved midnat. Dette job angiver de udløbne kontrakter til tilstanden Udløbet.

  • Organisationens fulde tekstkatalogindeks. Udfylder hele tekstindekset i db til søgning i Microsoft Knowledge Base-artikler i CRM.

Hvis tilbagevendende job blev annulleret, fjernes de.

Noter

  • For Microsoft Dynamics CRM SQL-scriptet i denne Knowledge Base-artikel er kun en engangsindsats. Du kan tilføje dette som et SQL-job for at køre på tilbagevendende nat-, uge- eller månedsbasis. Når din CRM kører, skal du enten anvende denne artikel ugentligt afhængigt af virksomhedens behov eller anvende løsningen ved at skrive brugerdefinerede MASSE DELETE-job. Se dokumentationen til CRM SDK på egenskaben BulkDeleteRequest.QuerySet, i klassen BulkDeleteRequest og i rækkefølgen af sletningen.

  • Sørg for, at AsyncOperation-posterne for arbejdsprocesser og de tilsvarende poster slettes fra objektet WorkflowLogBase.

  • Sørg for, at alle de tilsvarende poster for bulkdeletefailure og bulkdeleteoperation slettes.

  • Sørg for, at kun følgende Async-handlingstyper slettes, hvis tilstandskoden for typerne er 3, og statuskoden for typerne er 30 eller 32:

    • Udvidelsesopgave til arbejdsproces (1)
    • Indsaml SQM-data (9)
    • PersistMatchCode (12)
    • FullTextCatalogIndex (25)
    • UpdateContractStates (27)
    • Arbejdsproces (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

        
      

Forbedring af ydeevnen af sletningsscriptet

  • Hvis du vil forbedre den overordnede Microsoft Dynamics CRM ydeevne, skal du planlægge sletning af Microsoft Dynamics CRM til at køre uden for spidsbelastningstiden for Microsoft Dynamics CRM. Som standard kører tjenesten på det tidspunkt, hvor Microsoft Dynamics CRM blev installeret. Du kan dog indstille tjenesten til at køre kl. 22:00 i stedet for på standardtidspunktet. Det kan du gøre ved at bruge jobeditoren Microsoft Dynamics CRM ScaleGroup. Du kan finde flere oplysninger på følgende CodePlex-websted:
    http://crmjobeditor.codeplex.com/ Noter

    1. Denne handling påvirker ikke scriptets ydeevne direkte.
    2. Jobeditoren for Microsoft Dynamics CRM 4.0 er blevet depeceret og er ikke længere tilgængelig.
  • Hvis du vil forbedre ydeevnen for sletningsscripts i denne artikel og forbedre den Microsoft Dynamics CRM tjenestekode til sletning, der kører lignende sletninger, skal du føje følgende tre indekser til OrganizationName_MSCRM-databasen, før du kører sletningsscriptet i denne artikel:

    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
    
    

    Bemærk! Hvis du ikke tilføjer disse indekser, kan det tage timer at køre sletningsscriptet.

  • Stop den Microsoft Dynamics CRM asynkrone behandlingstjeneste, mens du kører dette script.

  • Valgfrit Genopbyg følgende indeks, og opdater statistik:

    -- 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
    
  • Valgfri opdateringsstatistik med fuld scanning på alle de tabeller, der er involveret i denne forespørgsel, ved hjælp af følgende kommandoer (helst uden spidsbelastningstimer):

    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
    
  • Valgfrit Skift MSCRM-databasens genoprettelsesmodel til Enkel for at undgå unødvendig generation af Microsoft SQL Server-logfiler. I SQL Server 2005 skal du logge på Microsoft SQL Server Management Studio som administrator, højreklikke på din <org_name>_MSCRM database, klikke på Egenskaber, klikke på Indstillinger og derefter klikke på Genoprettelsesmodel. Markér enkelt, og klik derefter på OK. Når du har kørt dette script første gang, bør den <org_name>_MSCRM databasegenoprettelsesmodel skiftes tilbage til FULD for at få den bedste model for genoprettelse af data.

  • Hvis du vil øge scriptets ydeevne, @DeleteRowCount kan værdien af 10.000 reduceres

            
For at bestemme antallet af poster, der skal slettes af scriptet i denne artikel, skal du køre følgende antal script med den OrganizationName_MSCRM database:


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

Scriptfejl

Når du kører oprydningsscriptet, modtager du muligvis en fejlmeddelelse, der ligner følgende:

Bemærk

DELETE-sætningen er i konflikt med REFERENCE-begrænsningen "asyncoperation_workflowwaitsubscription". Konflikten opstod i databasen "Contoso_MSCRM", tabellen "dbo. WorkflowWaitSubscriptionBase", kolonnen 'AsyncOperationId'. Opgørelsen er afsluttet.

            
Hvis du modtager denne fejlmeddelelse, skal du stoppe oprydningsscriptet og derefter følge disse trin for at fjerne de resterende WorkflowWaitSubscription-poster, der findes for fuldførte eller annullerede arbejdsprocesser. Disse poster bør ikke længere findes, fordi de skulle være blevet slettet, da arbejdsprocesserne blev fuldført eller annulleret. Du bør ikke kunne se nogen poster, der returneres fra denne forespørgsel. Alt, der er tilbage i tabellen WorkflowWaitSubscriptionBase, der vises i denne forespørgsel, er en horeungepost. Du kan ikke slette disse poster via brugergrænsefladen, fordi den Microsoft CRM Async-proces er i en annulleret eller fuldført tilstand.

Følgende script bekræfter, hvor mange uafhængige WorkflowWaitSubscriptionBase-poster der findes for fuldførte og annullerede arbejdsprocesposter:

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

Følgende script sletter WorkflowWaitSubscriptionBase-poster for strandede WorkflowWaitSubscriptionBase-poster for fuldførte og annullerede arbejdsprocesposter:

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

Når denne slettesætning er udført, fuldføres scriptet AsyncoperationBase og Workflow cleanup.

Flere oplysninger

Du kan få mere at vide ved at klikke på nedenstående artikelnumre for at få vist artiklerne i Microsoft Knowledge Base:

954929 AsyncOperation-objektet forbruger en betydelig del af [Org]_MSCRM-databasen og medfører dårlig ydeevne i Microsoft Dynamics CRM

957871 Arbejdsprocessens udvidelsesopgaveposter medfører, at tabellen AsyncOperationBase i MSCRM-databasen bliver for stor i Microsoft Dynamics CRM 4.0 Du kan få mere at vide om softwareopdateringsterminologi ved at klikke på nedenstående artikelnummer for at få vist artiklen i Microsoft Knowledge Base:

824684 Beskrivelse af den standardterminologi, der bruges til at beskrive Microsoft-softwareopdateringer Du kan finde flere oplysninger om hotfix- og opdateringspakketerminologi for Microsoft Business Solutions CRM ved at klikke på nedenstående artikelnummer for at få vist artiklen i Microsoft Knowledge Base:

887283 navngivningsstandarder for Microsoft Business Solutions CRM-software og -opdateringspakke