ดังนั้นฉันจึงมีกระบวนการแทรกจำนวนมากเพื่อนำข้อมูลจากตารางการแสดงละครของเราและย้ายไปยังดาต้ามาร์ตของเรา
กระบวนการนี้เป็นงานการไหลของข้อมูลอย่างง่ายพร้อมการตั้งค่าเริ่มต้นสำหรับ "แถวต่อชุด" และตัวเลือกคือ "tablock" และ "ไม่มีข้อ จำกัด ในการตรวจสอบ"
โต๊ะค่อนข้างใหญ่ 587,162,986 ที่มีขนาดข้อมูล 201GB และ 49GB ของพื้นที่ดัชนี ดัชนีคลัสเตอร์สำหรับตารางคือ
CREATE CLUSTERED INDEX ImageData ON dbo.ImageData
(
DOC_ID ASC,
ACCT_NUM ASC,
MasterID ASC
)
และคีย์หลักคือ:
ALTER TABLE dbo.ImageData
ADD CONSTRAINT ImageData
PRIMARY KEY NONCLUSTERED
(
ImageID ASC,
DT_CRTE_DOC ASC
)
ตอนนี้เราพบปัญหาที่BULK INSERT
SSIS ทำงานช้าอย่างไม่น่าเชื่อ 1 ชั่วโมงเพื่อแทรกล้านแถว แบบสอบถามที่เติมตารางนั้นเรียงลำดับแล้วแบบสอบถามที่เติมจะใช้เวลาไม่ถึงนาทีในการเรียกใช้
เมื่อกระบวนการทำงานฉันสามารถดูแบบสอบถามรอแทรกกลุ่มซึ่งจะใช้เวลาทุกที่ 5-20 PAGEIOLATCH_EX
วินาทีและแสดงประเภทของการรอคอย กระบวนการสามารถทำได้ครั้งละINSERT
ประมาณหนึ่งพันแถวเท่านั้น
เมื่อวานนี้ในขณะที่ทดสอบกระบวนการนี้กับสภาพแวดล้อม UAT ของฉันฉันพบปัญหาเดียวกัน ฉันรันกระบวนการสองสามครั้งและพยายามระบุสาเหตุของการแทรกที่ช้านี้ ทันใดนั้นเองมันก็เริ่มทำงานภายใน 5 นาที ดังนั้นฉันจึงวิ่งไปอีกสองสามครั้งพร้อมผลลัพธ์เดียวกัน นอกจากนี้จำนวนของเม็ดมีดจำนวนมากที่รอเป็นเวลา 5 วินาทีหรือมากกว่านั้นจะลดลงนับร้อยเป็น 4
ตอนนี้มันน่างงงวยเพราะมันไม่เหมือนว่าเรามีกิจกรรมที่ต้องทำมากมาย
CPU ในช่วงเวลาที่ต่ำ
เวลาที่ช้าลงจะมีการรอดิสก์น้อยลง
เวลาแฝงของดิสก์เพิ่มขึ้นจริง ๆ ในระหว่างกรอบเวลาที่กระบวนการทำงานภายใน 5 นาที
และ IO ต่ำกว่ามากในช่วงเวลาที่กระบวนการนี้ทำงานได้ไม่ดี
ฉันได้ตรวจสอบแล้วและไม่มีการขยายไฟล์เนื่องจากไฟล์เต็มเพียง 70% ไฟล์บันทึกยังคงมี 50% ที่จะไป DB อยู่ในโหมดการกู้คืนอย่างง่าย DB มีกลุ่มไฟล์เพียงกลุ่มเดียว แต่กระจายใน 4 ไฟล์
ดังนั้นสิ่งที่ฉันสงสัยA:เหตุใดฉันจึงเห็นช่วงเวลารอคอยขนาดใหญ่บนเม็ดมีดเหล่านั้น B:เวทมนต์อะไรที่ทำให้มันวิ่งเร็วขึ้น?
ข้อความด้านข้าง มันทำงานเหมือนอึอีกครั้งในวันนี้
อัปเดตมันถูกแบ่งพาร์ติชันในปัจจุบัน อย่างไรก็ตามมันทำในวิธีที่โง่ที่สุด
CREATE PARTITION SCHEME [ps_Image] AS PARTITION [pf_Image]
TO ([FG_Image], [FG_Image], [FG_Image], [FG_Image])
CREATE PARTITION FUNCTION [pf_Image](datetime) AS
RANGE RIGHT FOR VALUES (
N'2011-12-01T00:00:00.000'
, N'2013-04-01T00:00:00.000'
, N'2013-07-01T00:00:00.000'
);
สิ่งนี้ทำให้ข้อมูลทั้งหมดในพาร์ติชันที่ 4 เป็นหลัก อย่างไรก็ตามเนื่องจากเป็นกลุ่มไฟล์เดียวกันทั้งหมด ขณะนี้ข้อมูลถูกแบ่งออกเป็นสองส่วนเท่า ๆ กันในไฟล์เหล่านั้น
ปรับปรุง 2 สิ่ง เหล่านี้คือภาพรวมรอเมื่อกระบวนการทำงานไม่ดี
นี่คือการรอในช่วงเวลาที่ฉันสามารถเรียกใช้กระบวนการทำงานได้ดี
ระบบย่อยหน่วยเก็บข้อมูลเป็น RAID แบบพ่วงต่อแบบโลคัลไม่มี SAN ที่เกี่ยวข้อง บันทึกอยู่ในไดรฟ์อื่น Raid Controller คือ PERC H800 ที่มีขนาดแคช 1 GB (สำหรับ UAT) Prod คือ PERC (810)
เราใช้การกู้คืนอย่างง่ายโดยไม่มีการสำรองข้อมูล มันถูกกู้คืนจากสำเนาการผลิตทุกคืน
นอกจากนี้เรายังได้ตั้งค่าIsSorted property = TRUE
ใน SSIS เนื่องจากข้อมูลเรียงลำดับแล้ว
PAGEIOLATCH_EX
และASYNC_IO_COMPLETION
กำลังแสดงว่ากำลังรับข้อมูลจากดิสก์ไปยังหน่วยความจำ นี่อาจเป็นตัวบ่งชี้ปัญหาของระบบย่อยดิสก์หรืออาจเป็นการแย่งชิงหน่วยความจำ SQL Server มีหน่วยความจำเท่าใด
ASYNC_NETWORK_IO
หมายความว่า SQL Server กำลังรอส่งแถวไปยังไคลเอนต์ ฉันสมมติว่าจะแสดงกิจกรรมของ SSIS ที่กินแถวจากตารางการแสดง