ฉันมีหลายตารางที่มีจำนวนแถวระหว่าง 5M ถึง 1.5G
แต่ละตารางมีเขตข้อมูล BLOB ซึ่งขนาดแตกต่างจาก 100 ไบต์ถึง 30 MBytes และเก็บไว้เป็น 'ประเภทค่าขนาดใหญ่นอกแถว' = ON
ตารางจะถูกจัดเก็บในกลุ่มไฟล์ที่แตกต่างกันโดยแต่ละไฟล์มี 3-4 ไฟล์ในดิสก์ที่แตกต่างกัน @ LUNs ที่แตกต่างกัน @ SAN ที่เร็วมาก
ทุกวันโต๊ะเหล่านี้มีขนาดโตขึ้น 5-100 Gb และมีแถว 600k - 1.5M
หลังจากระยะเวลาหนึ่งซึ่งแตกต่างกันไปจาก 2 สัปดาห์ถึง 6 เดือนแถวบางแถวจะถูกลบหรือย้ายไปเก็บถาวร DB ดังนั้นจึงไม่มีแถวใด ๆ ในเวิร์กทอรีที่มีอายุมากกว่า 6 เดือน
การกำหนดค่าปัจจุบันของเซิร์ฟเวอร์:
- SQL เซิร์ฟเวอร์เอ็นจิ้นคือ 2008 R2 SP1 Enterprise @ 24 คอร์, @ 64Gb RAM
- SQL Server ทำงานด้วยการตั้งค่าสถานะเริ่มต้นพิเศษ:
-T 3640; (กำจัดการส่งข้อความ DONE_IN_PROC ไปยังไคลเอนต์สำหรับแต่ละคำสั่งในขั้นตอนการจัดเก็บซึ่งคล้ายกับการตั้งค่าเซสชันของ SET NOCOUNT ON แต่เมื่อตั้งค่าเป็นแฟล็กการติดตามทุกเซสชันไคลเอ็นต์จะถูกจัดการด้วยวิธีนี้)
-T 1118; (สลับการจัดสรรใน tempDB จาก 1pg ต่อครั้ง (สำหรับ 8 หน้าแรก) เป็นระดับหนึ่ง)
-T 2301; (เปิดใช้งานการปรับแต่งขั้นสูงที่เฉพาะเจาะจงกับแบบสอบถามสนับสนุนการตัดสินใจตัวเลือกนี้ใช้กับการประมวลผลสนับสนุนการตัดสินใจของชุดข้อมูลขนาดใหญ่)
-T 1117; (ขยายไฟล์ข้อมูลทั้งหมดในครั้งเดียวมิฉะนั้นจะเปลี่ยนไป)
-E; (เพิ่มจำนวนส่วนขยายที่ถูกจัดสรรสำหรับแต่ละไฟล์ในกลุ่มไฟล์ตัวเลือกนี้อาจเป็นประโยชน์สำหรับแอปพลิเคชันคลังข้อมูลที่มีจำนวน จำกัด ผู้ใช้ที่รันดัชนีหรือสแกนข้อมูล)
-T 834; (ทำให้ SQL Server ใช้การจัดสรรเพจขนาดใหญ่ของ Windows สำหรับหน่วยความจำที่จัดสรรให้กับพูลบัฟเฟอร์ http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft com / kb / 920093 )
- SQL Server ใช้ส่วนขยายของหน้าขนาดใหญ่
- SQL Server ใช้ตัวเลือกการเริ่มต้นไฟล์อย่างรวดเร็ว
- AUTOSHRINK ปิดใช้งานสำหรับฐานข้อมูลทั้งหมด
ปัญหาคือ - ที่เริ่มต้นจากบางช่วงเวลาของเซิร์ฟเวอร์ (จากสองสามวันถึงหนึ่งเดือน) GHOST CLEANUP
กระบวนการปฏิเสธการบังคับให้ล้างข้อมูลและเพียงแค่ทำงานตามปกติ - ล้างข้อมูลหลาย ๆ หน้าในเวลาไม่กี่วินาที ( which is seen thru Extended Events
) ซึ่งไม่เหมาะสมเพราะ ไม่สามารถล้างแถวที่ถูกลบทั้งหมดได้
ปัญหายังคงมีอยู่จากเวลาของ SQL Server 2005 RTM Enterprise
ฉันพยายามแก้ไขปัญหาได้อย่างไร:
- พยายามบังคับให้ SCAN ดำเนินการกับดัชนีคลัสเตอร์ของตาราง
- พยายามบังคับให้ SCAN ดำเนินการซึ่งเกี่ยวข้องกับเนื้อหาทั้งหมดของคอลัมน์ BLOB ในดัชนีคลัสเตอร์ของตาราง
- ระบบ sp_clean_db_free_space & sp_clean_db_file_free_space
- การล้างข้อมูลด้วยตนเอง dbcc (@dbid, @fileid, @page) สำหรับไฟล์และหน้าทั้งหมดใน DB
- ดัชนีคลัสเตอร์จะสร้างและจัดระเบียบใหม่
- การสร้างฐานข้อมูลใหม่
DBCC FORCEGHOSTCLEANUP
เมื่อฉันเรียกใช้แบบสอบถาม:
select * from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
ฉันเห็นบันทึกผีเป็นล้าน ๆ ล้าน แต่เฉพาะสำหรับหน่วยการจัดสรรประเภทของ LOB_DATA
สิ่งเดียวที่ช่วย:
- การหยุดเซิร์ฟเวอร์ด้วยคำสั่ง SHUTDOWN หรือรีสตาร์ทโฮสต์ทั้งหมด - ช่วยหลังจากรีสตาร์ทกระบวนการ GHOST CLEANUP แล้วจะทำงานหลายชั่วโมงและล้างข้อมูลบันทึกผีทั้งหมด
- DBCC SHRINKFILE พร้อมตัวเลือก EMPTYFILE - การย้ายข้อมูลทั้งหมดจากไฟล์หนึ่งไปยังไฟล์อื่นหรือไฟล์ที่สร้างขึ้นใหม่จะล้างข้อมูลบันทึกผีในไฟล์นี้เท่านั้น - ปัญหาคือฉันเกลียดการหดตัว และใช้เวลา 3-4 วันสำหรับไฟล์เดียว
คำถาม - มีวิธีการเขียนโปรแกรม (ดีกว่า) หรือการบำรุงรักษาเพื่อบังคับให้ GHOST CLEANUP ปราศจากการหยุดทำงานของเซิร์ฟเวอร์เลยเนื่องจากการหยุดทำงานของเซิร์ฟเวอร์มีค่าใช้จ่ายมากเกินไปแม้จะยอมรับไม่ได้ - จากหลายพันถึงหมื่นหมื่นดอลลาร์ต่อชั่วโมง
ปัญหาที่สังเกตเห็นเหมือนกันฉันอยู่ที่นี่:
- http://support.microsoft.com/kb/932115
- http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx
และเหมือนกันอยู่ที่นี่: