เหตุใดจึงไม่ลบพื้นที่ว่าง (DB2) ของ DELETE + REORG


18

ใน DB2 ฉันมีตารางที่มีข้อมูลไบนารีขนาดใหญ่ ตอนนี้ฉันล้างตารางทั้งหมดและรัน runstats, reorg, runstats แต่ปริมาณของพื้นที่ดิสก์ที่ใช้ไม่เปลี่ยนแปลง มีอะไรผิดปกติที่นี่?

ตารางอยู่ใน tablespace ของตัวเองซึ่งฉันสร้างดังต่อไปนี้:

CREATE BUFFERPOOL "MY_BP" SIZE 250 AUTOMATIC PAGESIZE 4096;
CREATE LARGE TABLESPACE MY_TBS IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 64 PREFETCHSIZE 64 BUFFERPOOL MY_BP OVERHEAD 10.500000 TRANSFERRATE 0.140000 FILE SYSTEM CACHING;

ฉันลบ / reorged ดังนี้:

DELETE FROM MY_TBL
RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL
REORG TABLE MY_TBL
RUNSTATS ON TABLE MY_TABLE WITH DISTRIBUTION AND DETAILED INDEXES ALL
ALTER TABLESPACE MY_TBS REDUCE

ตาราง MY_TBL ใช้เวลา 2.5GB ก่อนหน้านั้นทั้งหมดและหลังจากลบ / reorging จะใช้น้อยกว่า3 MBเท่านั้น

FWIW: ฉันใช้ DB2 / NT v9.5.2


สิ่งนี้ใช้ได้กับระบบบน db2 v8 หรือไม่?
Tony

คำตอบ:


22

ฉันจะเดาว่าคุณใช้ที่เก็บข้อมูลอัตโนมัติ (ไม่ใช่ว่าสิ่งนี้อาจเกิดขึ้นได้เป็นอย่างอื่น ... มันเป็นเรื่องง่ายที่จะเกิดขึ้นกับที่เก็บข้อมูลอัตโนมัติ)

ปัญหาน่าจะเกิดขึ้นที่ฐานข้อมูลของคุณเรียกคืนพื้นที่สำหรับตัวเอง แต่ไม่ได้ปล่อยดิสก์กลับสู่ระบบปฏิบัติการ สิ่งนี้สามารถแสดงได้อย่างง่ายดายโดยการตรวจสอบ High Water Mark สำหรับ tablespace

ทำสิ่งต่อไปนี้

db2 list tablespaces show detail

สิ่งนี้จะแสดงแต่ละพื้นที่ตารางและสิ่งที่มันใช้บนดิสก์ Used pagesคือจำนวนหน้าของดิสก์ที่ฐานข้อมูลใช้ เปรียบเทียบว่าเทียบกับtotal pages(ยอดรวมที่อ้างสิทธิ์ในดิสก์) และHigh water mark (pages)จะแสดงให้คุณเห็นถ้าคุณ "อ้างสิทธิ์" มากกว่าที่คุณต้องการจริงๆ (เช่นเพจที่มีการใช้งานต่ำหน้ารวมสูงมากและเครื่องหมายน้ำสูงใกล้กับหน้าทั้งหมด)

ที่จะได้รับการกำจัดของที่ไม่ได้ใช้พื้นที่นี้และกลับไปยังระบบปฏิบัติการที่คุณจะออกต่อไปนี้ db2 alter tablespace <tablespace name> reduce max(ภายใต้การจัดเก็บข้อมูลอัตโนมัติ): ตัวอย่าง

db2 alter tablespace ts1 reduce max;

ซึ่งจะทำให้ DB2 ลดเครื่องหมายน้ำสูงและปล่อยดิสก์ที่ไม่ได้ใช้กลับสู่ระบบปฏิบัติการ (หมายเหตุคุณสามารถทำได้เฉพาะกับพื้นที่ตารางปกติและขนาดใหญ่ไม่ใช่สำหรับระบบชั่วคราวหรือพื้นที่ตารางชั่วคราวของผู้ใช้)

หากคุณใช้ DMS โดยไม่มีที่เก็บข้อมูลอัตโนมัติคุณจำเป็นต้องใช้ชุดคำสั่งที่แตกต่างกันเล็กน้อย:

db2 alter tablespace <tablespace name> lower high water mark;
db2 alter tablespace reduce (<containter name> or [all containers] integer K|M|G or integer PERCENT);

ตัวอย่าง

db2 alter tablespace ts1 lower high water mark;
db2 alter tablespace reduce (all containers 500 M);

ที่ที่เราทำงานเราใส่สิ่งนี้ลงในสคริปต์การบำรุงรักษาบางส่วนของเราเพื่อให้เราเรียกใช้สิ่งนี้โดยอัตโนมัติหลังจากที่เราดำเนินการใหม่เพื่อให้แน่ใจว่าเราได้เรียกคืนพื้นที่ว่างในดิสก์ ในกรณีของเราเราใช้ DB2 LUW 9.7 FP 4 ดังนั้นจึงไม่เจ็บที่จะตรวจสอบศูนย์ข้อมูลสำหรับ 9.5 อีกครั้งเพื่อให้แน่ใจว่าคุณสามารถเข้าถึงข้อมูลที่ถูกต้องสำหรับรุ่นของคุณ

แก้ไข:หากพื้นที่ตารางของคุณมาจากฐานข้อมูลที่อัพเกรดเป็น DB2 9.7 คุณอาจจะไม่ได้ตั้งค่าคุณสมบัติหน่วยเก็บข้อมูลที่เรียกคืนได้ สิ่งนี้เป็นจริงแม้ว่าคุณจะอัปเกรดจาก DMS เป็นที่เก็บข้อมูลอัตโนมัติ ทั้งสองวิธีกัดในขณะที่คุณไม่สามารถลดเครื่องหมายน้ำที่สูง คุณต้องดัมพ์ตารางและข้อมูลออกจากนั้นปล่อยพื้นที่ตาราง จากนั้นสร้างพื้นที่ตารางใหม่โดยใช้ที่เก็บข้อมูลอัตโนมัติและนำเข้าข้อมูลสำหรับตารางของคุณ


+1 - ดีที่เห็นผู้เชี่ยวชาญ DB2 ที่มีส่วนร่วมในเว็บไซต์ เราอ่อนแอในโดเมนนั้นในอดีต
Philᵀᴹ

1
เป็นเพียงความคิดเห็นด่วนใน DB2 9.5 คุณไม่สามารถใช้alter tablespace <tbsp> lower high watermarkหรือalter tablespace <tbsp> reduce maxไวยากรณ์ - สิ่งเหล่านี้ไม่ได้ถูกนำมาใช้จนกว่า DB2 9.7
Ian Bjorhovde

ดังที่ฉันกล่าวถึงในโพสต์เริ่มต้นของฉันฉันได้ลองไปแล้วส่วนใหญ่และมันก็ไม่ได้ผล ถึงตอนนี้ฉันพบวิธีแก้ปัญหาของตัวเองแล้ว: ไม่สามารถเรียกคืนพื้นที่ดิสก์ได้เนื่องจากฉันไม่ได้ระบุตัวเลือก LONGLOBDATA ซึ่งดูเหมือนว่าจำเป็นถ้าคุณต้องการเรียกคืนพื้นที่ดิสก์จาก BLOBs หรือ CLOBs โปรดดูคำตอบสำหรับคำถามของฉันที่นี่ อย่างไรก็ตามฉันขอขอบคุณความพยายามที่คุณใส่ไว้ในคำตอบของคุณ +1!
Alexander Tobias Bockstaller

9

ตารางMY_TBLประกอบด้วยข้อมูลไบนารีขนาดใหญ่ในBLOBคอลัมน์ เอกสารของREORGคำสั่งระบุว่า DB2 หลีกเลี่ยงการจัดระเบียบอ็อบเจ็กต์ดังกล่าวใหม่เนื่องจากใช้เวลานานและไม่ปรับปรุงการทำคลัสเตอร์ อย่างไรก็ตาม DB2 สามารถบังคับให้จัดระเบียบข้อมูล LOB ใหม่หากระบุLONGLOBDATAตัวเลือก พื้นที่ที่ไม่ได้ใช้สามารถนำมาใช้ใหม่ได้โดย DB2 ดังนั้นการแทรกข้อมูลใหม่จะเติมหน้าที่มีอยู่และไม่ได้ใช้ก่อนการจัดสรรใหม่

วิ่ง

REORG TABLE MY_TBL LONGLOBDATA

เรียกคืนพื้นที่ว่างในดิสก์ 2.5GB ได้สำเร็จซึ่งใช้ตารางเปล่า

ฉันไม่รู้เกี่ยวกับตัวเลือกนี้และตรวจดูมันเป็นครั้งแรกที่ฉันอ่านเอกสาร


จุดดี. อย่างไรก็ตามจากสิ่งที่ฉันเพิ่งเรียนรู้ในตอน DB2NightShow "Attack of the Blob" คุณไม่ต้องการเรียกใช้ตัวเลือก LONGLOBDATA บ่อยเกินไปเนื่องจากใช้เวลานานกว่าและ / หรือทำให้เกิดปัญหาด้านประสิทธิภาพ (ถ้าคุณพยายามทำ REORG ออนไลน์) .
Chris Aldrich

ฐานข้อมูลที่เราจัดการมีข้อมูลบันทึกจากเครื่องจักรอุตสาหกรรม การค้นหากับฐานข้อมูลดังกล่าวไม่ใช่เวลาที่สำคัญดังนั้นหากประสิทธิภาพลดลงในระหว่างการเริ่มต้นใหม่นี่ไม่ใช่ปัญหา
Alexander Tobias Bockstaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.