הביצועים איטיים אם הטבלה AsyncOperationBase נעשית גדולה מדי ב- Microsoft Dynamics CRM

חל על
Dynamics CRM 4.0 Microsoft Dynamics CRM 2011 Dynamics CRM 2013 Dynamics CRM 2015

סימפטומים

כאשר אתה מפעיל את Microsoft Dynamics CRM 4.0, Microsoft Dynamics CRM 2011, Microsoft Dynamics CRM 2013 או Microsoft Dynamics CRM 2015, הטבלה AsyncOperationBase גדלה והופכת לגדולה מאוד. כאשר הטבלה מכילה מיליוני רשומות, הביצועים איטיים.

בנוסף, שגיאות הדומות לשגיאות הבאות נרשמות ביומן האירועים של היישום בשרת שבו פועל Microsoft Dynamics CRM:

הערה

סוג אירוע: שגיאה

מקור האירוע: MSCRMDeletionService

קטגוריית אירוע: אין

מזהה אירוע: 16387

תאריך: 2009/01/26

שעה: 11:41:54 AM

משתמש: לא ישים

מחשב: CRMSERVER

תיאור: שגיאה: שירות המחיקה נכשל בניקוי הטבלה=CleanupInactiveWorkflowAssembliesProcedure לקבלת מידע נוסף, עיין במרכז העזרה והתמיכה בכתובת http://go.microsoft.com/fwlink/events.asp.

פתרון

כדי לפתור בעיה זו, בצע ניקוי של הטבלה AsyncOperationBase על-ידי הפעלת קובץ ה- Script הבא מול מסד הנתונים **<OrgName>_MSCRM, כאשר מציין<המיקום OrgName>** מייצג את השם בפועל של הארגון שלך.

אזהרה לפני ניקוי הנתונים, שים לב שמשימות מערכת שהושלמו הן בעלות ערך עסקי במקרים מסוימים, ויש לאחסן אותן לתקופה ארוכה. לכן, עליך לדון בכך תחילה עם צוות הניהול של הארגון שלך.

משימות מערכת המושפעות:

  • איסוף נתוני SQM. מדדי איכות תוכנה אוספים נתונים עבור תוכנית חוויית הלקוח.

  • עדכון מצבי חוזה משימת SQL. משימה זו פועלת פעם ביום בחצות. משימה זו מגדירה את החוזים שפג תוקפם למצב של פג תוקפם.

  • אינדקס קטלוג הטקסט המלא של הארגון. מאכלס אינדקס טקסט מלא ב- db לחיפוש מאמרי Microsoft Knowledge Base ב- CRM.

אם משימות חוזרות בוטלו, הן יוסרו.

פתקים

  • עבור Microsoft Dynamics CRM קובץ ה- Script של SQL במאמר Knowledge Base זה הוא מאמץ חד-פעמי בלבד. באפשרותך להוסיף זאת כמשימת SQL שתפעל על בסיס קבוע מדי לילה, שבוע או חודש. כאשר ה- CRM שלך פועל, עליך ליישם מאמר זה מדי שבוע, בהתאם לצרכים העסקיים שלך, או ליישם את הפתרון על ידי כתיבת עבודות BULK DELETE מותאמות אישית. (עיין בתיעוד CRM SDK שלנו במאפיין BulkDeleteRequest.QuerySet במחלקה BulkDeleteRequest ובסדר המחיקה)

  • ודא שהרשומות של AsyncOperation עבור זרימות עבודה והרשומות המתאימות נמחקות מהאובייקט WorkflowLogBase.

  • ודא שכל הרשומות המתאימות של BulkDeleteFailure ו- bulkdeleteoperation נמחקו.

  • ודא שרק סוגי הפעולות האסינכרוניות הבאים יימחקו אם קוד המצב של הסוגים הוא 3 וקוד המצב של הסוגים הוא 30 או 32:

    • משימת הרחבת זרימת עבודה (1)
    • איסוף נתוני SQM (9)
    • PersistMatchCode (12)
    • FullTextCatalogIndex (25)
    • עדכוןמצבי חוזה (27)
    • זרימת עבודה (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

        
      

שיפור הביצועים של קובץ Script למחיקה

  • כדי לשפר את הביצועים הכוללים של Microsoft Dynamics CRM, תזמן את שירות המחיקה של Microsoft Dynamics CRM כך שיפעל מחוץ לשעות השיא עבור Microsoft Dynamics CRM. כברירת מחדל, השירות פועל בזמן ההתקנה של Microsoft Dynamics CRM. עם זאת, באפשרותך להגדיר את השירות לפעול ב- 22:00 במקום בשעה המוגדרת כברירת מחדל. לשם כך, השתמש בעורך המשימות של Microsoft Dynamics CRM ScaleGroup. למידע נוסף, בקר באתר האינטרנט הבא של CodePlex:
    http://crmjobeditor.codeplex.com/ הערות

    1. פעולה זו אינה משפיעה ישירות על ביצועי קובץ ה- Script.
    2. עורך המשימות עבור Microsoft Dynamics CRM 4.0 בוטל, והוא אינו זמין עוד.
  • כדי לשפר את הביצועים של קבצי ה- Script למחיקה במאמר זה וכדי לשפר את קוד שירות המחיקה של Microsoft Dynamics CRM שמפעיל מחיקות דומות, הוסף את שלושת האינדקסים הבאים למסד הנתונים OrganizationName_MSCRM לפני שתפעיל את קובץ ה- Script למחיקה במאמר זה:

    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
    
    

    הערה אם לא תוסיף אינדקסים אלה, הפעלת קובץ ה- Script של המחיקה עשויה להימשך שעות.

  • הפסק את שירות העיבוד האסינכרוני של Microsoft Dynamics CRM בעת הפעלת קובץ Script זה.

  • אופציונלי: בנה מחדש את האינדקסים הבאים ועדכן סטטיסטיקות:

    -- 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
    
  • עדכון סטטיסטיקות אופציונלי עם סריקה מלאה בכל הטבלאות המעורבות בשאילתה זו באמצעות הפקודות הבאות (עדיף מחוץ לשעות השיא):

    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
    
  • אופציונלי: שנה את מודל השחזור של מסד נתונים MSCRM ל'פשוט' כדי למנוע ייצור עודף של יומני רישום של Microsoft SQL Server. עבור SQL Server 2005, היכנס ל- Microsoft SQL Server Management Studio כמנהל מערכת, לחץ באמצעות לחצן העכבר הימני על מסד הנתונים של <org_name>_MSCRM, לחץ על 'מאפיינים', לחץ על 'אפשרויות' ולאחר מכן לחץ על 'מודל שחזור'. סמן פשוט ולאחר מכן לחץ על אישור. לאחר הפעלת קובץ Script זה בפעם הראשונה, מודל שחזור מסד הנתונים של <org_name>_MSCRM אמור לחזור למצב מלא לקבלת מודל שחזור הנתונים הטוב ביותר.

  • כדי לשפר את ביצועי קובץ ה- Script, ניתן להקטין את הערך @DeleteRowCount של 10,000

            
כדי לקבוע את מספר הרשומות שיש למחוק על-ידי קובץ ה- Script במאמר זה, הפעל את קובץ ה- Script הבא לספירה מול מסד הנתונים של OrganizationName_MSCRM:


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

שגיאת Script

בעת הפעלת קובץ ה- Script של הניקוי, ייתכן שתקבל הודעת שגיאה כגון זו:

הערה

משפט DELETE התנגש עם אילוץ REFERENCE "asyncoperation_workflowwaitsubscription". ההתנגשות התרחשה במסד הנתונים "Contoso_MSCRM", בטבלה "dbo. WorkflowWaitSubscriptionBase", עמודה 'AsyncOperationId'. ההצהרה בוטלה.

            
אם אתה מקבל הודעת שגיאה זו, הפסק את קובץ ה- Script לניקוי ולאחר מכן בצע את השלבים הבאים כדי להסיר את שאר רשומות WorkflowWaitSubscription הקיימות עבור זרימות עבודה שהושלמו או בוטלו. רשומות אלה לא אמורות להתקיים עוד, מכיוון שהן היו אמורות להימחק לאחר השלמת זרימות העבודה או ביטולן. אינך אמור לראות רשומות שהוחזרו משאילתה זו. כל מה שנותר בטבלה WorkflowWaitSubscriptionBase המופיע בשאילתה זו הוא רשומה מיותמת. אין באפשרותך למחוק רשומות אלה באמצעות ממשק המשתמש מאחר שהתהליך האסינכרוני של Microsoft CRM נמצא במצב מבוטל או הושלם.

קובץ ה- Script הבא יאמת כמה רשומות מיותמות של WorkflowWaitSubscriptionBase קיימות עבור רשומות זרימת עבודה שהושלמו ובוטלו:

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

קובץ ה- Script הבא ימחק רשומות WorkflowWaitSubscriptionBase עבור רשומות WorkflowWaitSubscriptionBase תקועות עבור רשומות זרימת עבודה שהושלמו ובוטלו:

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

לאחר ביצוע משפט מחיקה זה, AsyncoperationBase וקובץ ה- Script לניקוי זרימת העבודה יושלמו בהצלחה.

מידע נוסף

לקבלת מידע נוסף, לחץ על מספרי המאמרים שלהלן כדי להציגם מתוך מאגר הידע Microsoft Knowledge Base:

954929 הישות AsyncOperation צורכת חלק משמעותי ממסד הנתונים של [Org]_MSCRM וגורמת לביצועים ירודים ב Microsoft Dynamics CRM

957871 רשומות משימת הרחבת זרימת העבודה גורמות לטבלה AsyncOperationBase במסד הנתונים MSCRM לגדול יותר מדי ב Microsoft Dynamics CRM 4.0 לקבלת מידע נוסף על המינוח של עדכוני תוכנה, לחץ על מספר המאמר שלהלן כדי להציגו מתוך מאגר הידע Microsoft Knowledge Base:

824684 תיאור של המונחים הסטנדרטיים המשמשים לתיאור עדכוני תוכנה של Microsoftלקבלת מידע נוסף על המינוח של תוכנת Microsoft Business Solutions עבור תיקון חם וחבילת עדכונים של תוכנת CRM, לחץ על מספר המאמר שלהלן כדי להציגו מתוך מאגר הידע Microsoft Knowledge Base:

887283 פתרונות עסקיים של Microsoft תיקון חם לתוכנת CRM ועדכון תקני מתן שמות לחבילות