סימפטומים
כאשר אתה מפעיל את 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/ הערות- פעולה זו אינה משפיעה ישירות על ביצועי קובץ ה- Script.
- עורך המשימות עבור 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 ועדכון תקני מתן שמות לחבילות