A teljesítmény lassú, ha az AsyncOperationBase tábla túl nagyra nő a Microsoft Dynamics CRM rendszerben

Hatókör
Dynamics CRM 4.0 Microsoft Dynamics CRM 2011 Dynamics CRM 2013 Dynamics CRM 2015

Tünetek

A Microsoft Dynamics CRM 4.0, a Microsoft Dynamics CRM 2011, a Microsoft Dynamics CRM 2013 vagy a Microsoft Dynamics CRM 2015 futtatásakor az AsyncOperationBase tábla nagyon nagyra nő. Ha a tábla több millió rekordot tartalmaz, a teljesítmény lassú.

Ezenkívül a következőhöz hasonló hibák is bekerülnek a Microsoft Dynamics CRM rendszert futtató kiszolgálón az események naplójába:

Megjegyzés

Eseménytípus: Hiba

Esemény forrása: MSCRMDeletionService

Eseménykategória: Nincs

Eseménykód: 16387

Dátum: 2009/01/26

Időpont: 11:41:54 de.

Felhasználó: – N/A

Számítógép: CRMSERVER

Leírás: Hiba: A törlési szolgáltatás nem tudta eltávolítani a table=CleanupInactiveWorkflowAssembliesProcedure További információt a http://go.microsoft.com/fwlink/events.asp webhely Súgó és támogatás központjában talál.

Megoldás

A probléma megoldásához végezze el az AsyncOperationBase tábla karbantartását úgy, hogy futtatja a következő parancsfájlt az **<OrgName>_MSCRM adatbázison, ahol azOrgName>** helyőrző <a szervezet tényleges nevét jelöli.

Figyelmeztetés Az adatok törlése előtt vegye figyelembe, hogy a befejezett rendszerfeladatok bizonyos esetekben üzleti jelentőséggel bírnak, illetve hosszú ideig kell tárolni őket. Ezért ezt először a szervezet adminisztrátorával érdemes megbeszélnie.

Érintett rendszerfeladatok:

  • SQM adatgyűjtés. A szoftverminőségi mutatók az ügyfélélmény programhoz gyűjtenek adatokat.

  • Szerződésállapotok frissítése SQL-feladat. Ez a feladat naponta egyszer, éjfélkor fut. Ez a feladat a lejárt szerződéseket Lejárt állapotúra állítja.

  • Szervezet teljes szöveges katalógusindexe. Teljes szöveges index kitöltése adatváltozatban a Microsoft Tudásbázis-cikkekben való kereséshez a CRM rendszerben.

Az ismétlődő feladatok megszakítása után a rendszer eltávolítja őket.

Megjegyzések

  • A Microsoft Dynamics CRM esetén A jelen tudásbáziscikkben szereplő SQL-parancsfájl egyszeri feladat. Ezt hozzáadhatja SQL-feladatként, amely ismétlődően éjszakai, heti vagy havi rendszerességgel fut. A CRM futásakor az üzleti igényektől függően hetente kell alkalmaznia ezt a cikket, vagy egyéni TÖMEGES TÖRLÉSI feladatok írásával alkalmaznia kell a megoldást. (A BulkDeleteRequest.QuerySet tulajdonságról, a BulkDeleteRequest osztályról és a törlés sorrendjéről tekintse meg a CRM SDK dokumentációját.)

  • Győződjön meg arról, hogy a munkafolyamatok AsyncOperation rekordjai és a kapcsolódó rekordok törlődtek a WorkflowLogBase objektumból.

  • Győződjön meg arról, hogy az összes kapcsolódó bulkdeletefailure és bulkdeleteoperation rekord törlődött.

  • Győződjön meg arról, hogy csak a következő aszinkron művelettípusok törlődnek, ha a típusok állapotkódja 3, állapotkódja pedig 30 vagy 32:

    • Munkafolyamat-bővítési feladat (1)
    • SQM adatok gyűjtése (9)
    • PersistMatchCode (12)
    • FullTextCatalogIndex (25)
    • UpdateContractStates (27)
    • Munkafolyamat (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

        
      

A törlési parancsfájl teljesítményének javítása

  • A Microsoft Dynamics CRM általános teljesítményének javítása érdekében ütemezze a Microsoft Dynamics CRM Törlési szolgáltatást csúcsidőn kívüli időre a Microsoft Dynamics CRM számára. Alapértelmezés szerint a szolgáltatás a Microsoft Dynamics CRM telepítésekor fut. Beállíthatja azonban, hogy a szolgáltatás az alapértelmezett időpont helyett este 10:00 órakor fusson. Ehhez használja a Microsoft Dynamics CRM ScaleGroup feladatszerkesztőjét. További információért látogasson el a CodePlex következő webhelyére:
    http://crmjobeditor.codeplex.com/ Megjegyzések

    1. Ez a művelet nincs közvetlen hatással a parancsprogram teljesítményére.
    2. A Microsoft Dynamics CRM 4.0 feladatszerkesztője már nem érhető el.
  • A cikkben ismertetett törlési parancsfájlok teljesítményének javítása, valamint a hasonló törléseket futtató Microsoft Dynamics CRM törlési szolgáltatáskód javítása érdekében vegye fel az alábbi három indexet a OrganizationName_MSCRM adatbázisba, mielőtt futtatná a cikkben szereplő törlési parancsfájlt:

    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
    
    

    Megjegyzés: Ha nem veszi fel ezeket az indexeket, a törlési parancsfájl futtatása akár órákig is eltarthat.

  • A parancsfájl futtatása közben állítsa le a Microsoft Dynamics CRM aszinkron feldolgozási szolgáltatását.

  • Nem kötelező: Építse újra az alábbi indexeket, és frissítse a statisztikákat:

    -- 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
    
  • Nem kötelező: Frissítse a statisztikát teljes vizsgálattal a lekérdezésben érintett összes táblán a következő parancsok használatával (lehetőleg csúcsidőn kívül):

    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
    
  • Nem kötelező: Módosítsa az MSCRM-adatbázis helyreállítási modelljét Egyszerű értékre, hogy elkerülje a Microsoft SQL Server naplók túlzott létrehozását. SQL Server 2005 esetén jelentkezzen be rendszergazdaként a Microsoft SQL Server Management Studio-ba, kattintson a jobb gombbal a org_name_MSCRM> adatbázisra, kattintson a <Tulajdonságok parancsra, válassza a Beállítások parancsot, majd kattintson a Helyreállítási modell parancsra. Jelölje meg az Egyszerű jelölést, majd kattintson az OK gombra. A parancsprogram első futtatásakor az org_name>_MSCRM adatbázis-helyreállítási <modellt vissza kell állítani FULL értékre a legjobb adat-helyreállíthatósági modell érdekében.

  • A parancsfájl teljesítményének növelése érdekében a @DeleteRowCount 10 000-es érték csökkenthető

            
A cikkben szereplő parancsfájl által törölendő rekordok számának meghatározásához futtassa a következő számláló parancsfájlt a OrganizationName_MSCRM adatbázison:


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

Parancsfájlhiba

A karbantartási parancsfájl futtatásakor a következőhöz hasonló hibaüzenet jelenhet meg:

Megjegyzés

A DELETE utasítás ütközött a "asyncoperation_workflowwaitsubscription" REFERENCE megkötéssel. Az ütközés a(z) "Contoso_MSCRM adatbázisban", a "dbo" táblában lépett fel. WorkflowWaitSubscriptionBase", AsyncOperationId" oszlop. Az utasítás lezárult.

            
Ha megjelenik ez a hibaüzenet, állítsa le a karbantartási parancsfájlt, majd az alábbi lépéseket követve távolítsa el a befejezett vagy megszakított munkafolyamatokhoz tartozó fennmaradó WorkflowWaitSubscription rekordokat. Ezeknek a rekordoknak már nem kellene létezniük, mert a munkafolyamatok befejezésekor vagy megszakításakor törölni kellett volna őket. Nem szabadna megjelennie a lekérdezés által visszaadott rekordoknak. A lekérdezésben megjelenő WorkflowWaitSubscriptionBase táblában csak árva rekordok maradnak. Ezeket a rekordokat nem lehet a felhasználói felületen keresztül törölni, mert a Microsoft CRM aszinkron folyamata megszakított vagy befejezett állapotban van.

A következő parancsfájl ellenőrzi, hogy hány árva WorkflowWaitSubscriptionBase rekord létezik a befejezett és megszakított munkafolyamat-rekordokhoz:

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

A következő parancsfájl törli a befejezett és megszakított munkafolyamat-rekordok elakadt WorkflowWaitSubscriptionBase rekordjainak WorkflowWaitSubscriptionBase rekordjait:

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

A delete utasítás végrehajtása után az AsyncoperationBase és a munkafolyamat-karbantartási parancsfájl sikeresen befejeződik.

További információ

További információ a Microsoft Tudásbázis következő számú cikkeiben olvasható (a cikkek megnyitásához kattintson a sorszámra):

954929 Az AsyncOperation entitás felhasználja a(z) [Org]_MSCRM adatbázis jelentős részét, és gyenge teljesítményt okoz a Microsoft Dynamics CRM

957871 A munkafolyamat-bővítési feladatrekordok miatt az MSCRM adatbázisában az AsyncOperationBase tábla túl nagyra nő a Microsoft Dynamics CRM 4.0-s verziójában. A szoftverfrissítésekkel kapcsolatos terminológiáról a Microsoft Tudásbázis alábbi cikkében tájékozódhat:

824684 A Microsoft szoftverfrissítéseinek leírására használt szabványos terminológia A Microsoft Business Solutions CRM szoftverekkel kapcsolatos gyorsjavítási és frissítési csomagokkal kapcsolatos terminológiájáról a Microsoft Tudásbázis alábbi cikkében tájékozódhat:

887283 Microsoft Business Solutions CRM szoftver gyorsjavítási és frissített csomagelnevezési szabványok