Wednesday, July 02, 2008

K2 Performance Tuning

K2 Workflow เป็น Workflow Engine Application ที่ทำงานร่วมกับ Microsoft .net application
ปัญหาที่พบคือ เมื่อข้อมูลมีปริมาณมาก จะทำการ Open Worklist ช้าลงมาก เนื่องมาจาก การ Join query เพื่อดึงข้อมูล สำหรับ command นี้
SELECT ProcID, ActID, EventID, w.ID, w.Status, w.Data, pi.ID, pi.Status, pi.StartDate, pi.Priority, pi.ExpectedDuration, pi.Folio, pi.Guid, EventInstID, EIPriority, EIExpectedDuration, EIStartDate, ActInstDestID, wh.ActInstID, AIPriority, AIExpectedDuration, AIStartDate, pf.Data, pf.Xml, af.Data, af.Xml
FROM _Worklist w (NOLOCK)
JOIN _WorklistHeader wh (NOLOCK) ON w.ProcInstID = wh.ProcInstID AND w.HeaderID = wh.ID
JOIN _ProcInst pi (NOLOCK) ON w.ProcInstID = pi.ID
JOIN _Field pf (NOLOCK) ON pi.ID = pf.ProcInstID AND wh.ProcInstFieldID = pf.ID
JOIN _Field af (NOLOCK) ON pi.ID = af.ProcInstID AND w.ActInstDestFieldID = af.ID


หลังจากการ Tuning แล้ว สามารถเพิ่มความเร็วได้มาก
เฉพาะหน้าเกิด workflow เปลี่ยนจาก ประมาณ 2 นาที กลายเป็นไม่ถึง 40 วินาที
และการทำงานในส่วนอื่น ก็เปลี่ยนไปมาก เช่นกัน

BEGIN TRANSACTION
SET @bErrors = 0

CREATE CLUSTERED INDEX [_Field2] ON [dbo].[_Field] ([ProcInstID] ASC, [ID] ASC )
IF( @@error <> 0 ) SET @bErrors = 1

IF( @bErrors = 0 )
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION

BEGIN TRANSACTION
SET @bErrors = 0

CREATE CLUSTERED INDEX [_Worklist1] ON [dbo].[_Worklist] ([User] ASC, [ProcInstID] ASC )
IF( @@error <> 0 ) SET @bErrors = 1

IF( @bErrors = 0 )
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION

No comments: