KB2967240 - การแก้ไข: ไม่สามารถเรียกคืนพื้นที่ที่ไม่ได้ใช้โดยใช้การลดขนาดในตารางที่มีคอลัมน์ LOB ใน SQL Server

นำไปใช้กับ
SQL Server 2008 Service Pack 3 SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2008 R2 Service Pack 2 SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

อาการ

สมมติว่าคุณมีตารางที่มีคอลัมน์วัตถุขนาดใหญ่ (LOB) ใน Microsoft SQL Server 2008, SQL Server 2008 R2, SQL Server 2012 หรือ SQL Server 2014 เมื่อคุณอัปเดตคอลัมน์ LOB ด้วยข้อมูล LOB ที่มีขนาดเล็กลง และพยายามเรียกคืนพื้นที่ที่ไม่ได้ใช้โดยใช้วิธีการต่อไปนี้

  • DBCC SHRINKDATABASE / DBCC SHRINKFILE
  • จัดระเบียบดัชนีใหม่ด้วย (LOB_COMPACTION = ON)

ในกรณีนี้ พื้นที่ที่ไม่ได้ใช้งานจะไม่สามารถเรียกคืนได้

การแก้ปัญหา

ปัญหานี้ได้รับการแก้ไขครั้งแรกในการอัปเดตแบบสะสมของ SQL Server ต่อไปนี้

การอัปเดตสะสม 2 สําหรับ SQL Server 2012 SP2 /en-us/help/2983175

การอัปเดตสะสม 11 สําหรับ SQL Server 2012 SP1 /en-us/help/2975396

การอัปเดตสะสม 13 สําหรับ SQL Server 2008 R2 SP2 /en-us/help/2967540

การอัปเดตสะสม 2 สําหรับ SQL Server 2014 /en-us/help/2967546

การอัปเดตสะสม 17 สําหรับ SQL Server 2008 SP3 /en-us/help/2958696

เกี่ยวกับการอัปเดตสะสมสําหรับ SQL Server

การอัปเดตแบบสะสมใหม่แต่ละรายการสําหรับ SQL Server จะมีโปรแกรมแก้ไขด่วนและการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการอัปเดตแบบสะสมครั้งก่อนหน้า ตรวจดูการอัปเดตแบบสะสมล่าสุดสําหรับ SQL Server:

      

วิธีแก้ไขปัญหาชั่วคราว

เมื่อต้องการแก้ไขปัญหานี้ชั่วคราว ให้ใช้วิธีแก้ไขปัญหาชั่วคราวต่อไปนี้:

  • ส่งออกแถวทั้งหมดไปยังตารางใหม่ และย้ายแถวเหล่านั้นกลับไป การทําเช่นนี้จะจัดระเบียบข้อมูล LOB ใหม่และปล่อยพื้นที่ที่ไม่ได้ใช้
  • ใช้ DBCC SHRINKFILE กับตัวเลือก EMPTYFILE เพื่อย้ายข้อมูลทั้งหมดไปยังไฟล์ข้อมูลที่เพิ่มใหม่ แล้วเอาไฟล์ข้อมูลเก่าออก ซึ่งจะจัดระเบียบข้อมูล LOB ใหม่โดยการปล่อยพื้นที่ที่ไม่ได้ใช้

ข้อมูลเพิ่มเติม

ตัวอย่างต่อไปนี้แสดงพื้นที่ที่ไม่ได้ใช้งานโดยใช้คําสั่ง TSQL sp_spaceused 'table_name' ก่อนและหลังจากที่คุณอัปเดตคอลัมน์ LOB ด้วยข้อมูล LOB ที่มีขนาดเล็กลง:
ก่อนอัปเดต:

ชื่อ rows สงวนไว้ ข้อมูล index_size ไม่ได้ใช้
table_name 1000 261072 KB 261056 KB 16 KB 0 KB

หลังจากที่คุณอัปเดต:

ชื่อ rows สงวนไว้ ข้อมูล index_size ไม่ได้ใช้
table_name 1000 261072 KB 199672 KB 16 KB 61384 KB

      

สถานะ

Microsoft ได้ยืนยันว่านี่เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ที่แสดงไว้ในส่วน "นำไปใช้กับ"