Symptom
När du kör Microsoft Dynamics CRM 4.0 Microsoft Dynamics CRM 2011, Microsoft Dynamics CRM 2013 eller Microsoft Dynamics CRM 2015 blir AsyncOperationBase-tabellen mycket stor. Prestandan går långsamt när tabellen innehåller miljontals poster.
Dessutom loggas fel som liknar följande i programhändelseloggen på servern som kör Microsoft Dynamics CRM:
Obs
Händelsetyp: Fel
Händelsekälla: MSCRMDeletionService
Händelsekategori: Ingen
Händelse-ID: 16387
Datum: 2009-01-26
Tid: 11:41:54 AM
Användare: Saknas
Dator: CRMSERVER
Beskrivning/ kontroller: fel: Borttagningstjänsten kunde inte rensa tabell=CleanupInactiveWorkflowAssembliesProcedure Mer information finns i Hjälp och supportcenter på http://go.microsoft.com/fwlink/events.asp.
Lösning
Lös problemet genom att utföra en rensning av AsyncOperationBase-tabellen genom att köra följande skript mot**<OrgName>_MSCRM-databasen, där platshållaren<OrgName>** representerar organisationens faktiska namn.
Varning Innan du rensar data bör du vara medveten om att slutförda systemjobb i vissa fall har affärsvärde och måste lagras under en lång period. Därför bör du först diskutera detta med organisationens administrationspersonal.
Systemjobb som påverkas:
SQM-datainsamling. Mätvärden för programvarukvalitet samlar in data för kundupplevelseprogrammet.
Uppdatera SQL-jobb för kontraktstillstånd. Det här jobbet körs en gång per dag vid midnatt. Det här jobbet anger förfallna kontrakt till ett tillstånd som har gått ut.
Organisationsindex för fullständig textkatalog. Fyller i fullständigt textindex i db för att söka i Microsoft Knowledge Base-artiklar i CRM.
Om återkommande jobb har avbrutits tas de bort.
Anteckningar
För Microsoft Dynamics CRM SQL-skriptet i den här Knowledge Base-artikeln är endast ett engångsförsök. Du kan lägga till detta som ett SQL-jobb om du vill köra det på återkommande basis per natt, varje vecka eller varje månad. När crm-programmet körs måste du antingen tillämpa den här artikeln varje vecka, beroende på dina affärsbehov, eller tillämpa lösningen genom att skriva anpassade MASSBORTTAGNING-jobb. (Se vår CRM SDK-dokumentation om egenskapen BulkDeleteRequest.QuerySet, på klassen BulkDeleteRequest och i borttagningsordningen)
Kontrollera att AsyncOperation-posterna för arbetsflöden och motsvarande poster tas bort från WorkflowLogBase-objektet.
Kontrollera att alla motsvarande bulkdeletefailure- och massborttagningsoperationsposter har tagits bort.
Kontrollera att endast följande Async-åtgärdstyper tas bort om tillståndskoden för typerna är 3 och statuskoden för typerna är 30 eller 32:
- Uppgift för arbetsflödesexpansion (1)
- Samla in SQM-data (9)
- PersistMatchCode (12)
- FullTextCatalogIndex (25)
- UpdateContractStates (27)
- Arbetsflöde (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
Förbättra borttagningsskriptets prestanda
Om du vill förbättra prestandan för den övergripande Microsoft Dynamics CRM schemalägger du borttagningstjänsten för Microsoft Dynamics CRM så att den körs under lågbelastningstider för Microsoft Dynamics CRM. Som standard körs tjänsten vid den tidpunkt då Microsoft Dynamics CRM installerades. Du kan däremot ange att tjänsten ska köras klockan 22:00 i stället för vid standardtiden. Det gör du med hjälp av Microsoft Dynamics CRM ScaleGroup Job Editor. Mer information finns på följande CodePlex-webbplats:
http://crmjobeditor.codeplex.com/ Anteckningar- Den här åtgärden påverkar inte skriptets prestanda direkt.
- Jobbredigeraren för Microsoft Dynamics CRM 4.0 har depecificerats och är inte längre tillgänglig.
Om du vill förbättra prestandan för borttagningsskripten i den här artikeln och förbättra Microsoft Dynamics CRM borttagningstjänstkod som kör liknande borttagningar, lägger du till följande tre index i OrganizationName_MSCRM-databasen innan du kör borttagningsskriptet i den här artikeln:
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) GOObs! Om du inte lägger till dessa index kan det ta timmar att köra borttagningsskriptet.
Stoppa den Microsoft Dynamics CRM asynkrona bearbetningstjänsten när du kör skriptet.
Om du vill kan du återskapa följande index och uppdatera 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) GOValfri uppdateringsstatistik med fullständig sökning för alla tabeller som ingår i den här frågan med hjälp av följande kommandon (helst vid lågtrafik):
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 FULLSCANValfritt Ändra MSCRM-databasens återställningsmodell till Enkel för att undvika överflödig generering av Microsoft SQL Server loggar. I SQL Server 2005 loggar du in på Microsoft SQL Server Management Studio som administratör, högerklickar på org_name<>_MSCRM databas, klickar på Egenskaper, på Alternativ och sedan på Återställningsmodell. Markera Enkelt och klicka sedan på OK. När du kör skriptet för första gången ska den <org_name>_MSCRM databasåterställningsmodellen växlas tillbaka till FULL för bästa dataåterställningsmodell.
För att öka skriptets @DeleteRowCount prestanda kan värdet på 10 000 minskas
Om du vill ta reda på hur många poster som ska tas bort av skriptet i den här artikeln kör du följande antal skript mot OrganizationName_MSCRM-databasen:
Select Count(AsyncOperationId)from AsyncOperationBase WITH (NOLOCK)
where OperationType in (1, 9, 12, 25, 27, 10)
AND StateCode = 3 AND StatusCode IN (30,32)
Skriptfel
När du kör rensningsskriptet kan du få ett felmeddelande som liknar följande:
Obs
DELETE-instruktionen var i konflikt med REFERENS-villkoret "asyncoperation_workflowwaitsubscription". Konflikten uppstod i databasen "Contoso_MSCRM", tabell "dbo. WorkflowWaitSubscriptionBase", kolumnen "AsyncOperationId". Utdraget har avslutats.
Om du får det här felmeddelandet stoppar du rensningsskriptet och följer sedan de här stegen för att ta bort de återstående WorkflowWaitSubscription-posterna som finns för slutförda eller avslutade arbetsflöden. De här posterna bör inte längre finnas, eftersom de borde ha tagits bort när arbetsflödena slutfördes eller avbröts. Du bör inte se några poster som returneras från den här frågan. Allt som finns kvar i tabellen WorkflowWaitSubscriptionBase som visas i den här frågan är en överbliven post. Du kan inte ta bort dessa poster via användargränssnittet eftersom Microsoft CRM Async-processen är i ett avslutat eller slutfört tillstånd.
Följande skript verifierar hur många överblivna WorkflowWaitSubscriptionBase-poster som finns för slutförda och avslutade arbetsflödesposter:
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öljande skript tar bort WorkflowWaitSubscriptionBase-poster för strandsatta WorkflowWaitSubscriptionBase-poster för slutförda och avslutade arbetsflödesposter:
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 borttagningssatsen har körts slutförs skriptet AsyncoperationBase och Workflow cleanup.
Mer information
Om du vill ha mer information klickar du på följande artikelnummer för att visa artiklarna i Microsoft Knowledge Base:
954929 AsyncOperation-enheten använder en betydande del av [Org]_MSCRM-databasen och orsakar dåliga prestanda i Microsoft Dynamics CRM
957871 Poster för arbetsflödesexpansionsuppgift gör att AsyncOperationBase-tabellen i MSCRM-databasen blir för stor i Microsoft Dynamics CRM 4.0 Om du vill ha mer information om terminologi för programuppdateringar klickar du på följande artikelnummer för att visa artikeln i Microsoft Knowledge Base:
824684 Beskrivning av standardterminologin som används för att beskriva Microsofts programuppdateringarOm du vill ha mer information om snabbkorrigeringar och uppdateringspaketterminologi för Microsoft Business Solutions CRM klickar du på följande artikelnummer för att visa artikeln i Microsoft Knowledge Base:
887283 namnstandarder för namn på paket i Microsoft Business Solutions CRM