การกู้คืนพื้นที่เชิงตรรกะจาก tablespace


11

ฉันมีพื้นที่ตารางที่เรียกว่า DATA และเป็นการตั้งค่าโดยอัตโนมัติขยายเป็นเท็จ tablespace นี้มีสองดาต้าไทล์และตั้งค่าดังนั้นจึงใช้พื้นที่ฟิสิคัล 350 GB

สัปดาห์ที่ผ่านมาฉันได้สอบถาม user_tablespaces และ dba_data_files และสังเกตว่ามันมีพื้นที่โลจิคัลว่าง 20% ฉันดำเนินการตามขั้นตอนด้วยการล้างข้อมูลและลบระเบียนจำนวนมากจากตารางใน tablespace นี้ เราคาดว่าจะเห็นพื้นที่ว่างเพิ่มขึ้นอย่างมาก น่าเสียดายที่เมื่อฉันสอบถามความคิดเห็นฉันสังเกตเห็นว่ามีพื้นที่ว่างตอนนี้ 20.5%

อาจเป็นเพราะการกระจายตัวของข้อมูลหรือไม่ เราสามารถ "จัดเรียงข้อมูล" พื้นที่ตารางอย่างใดและกู้คืนพื้นที่ที่สูญหายหรือไม่ หรือเราจำเป็นต้องสร้าง tablespace ตั้งแต่เริ่มต้นหรือไม่

คำตอบ:


14

เมื่อคุณลบระเบียนจะไม่มีสิ่งใดที่บีบอัดส่วนโดยอัตโนมัติดังนั้นคุณจะต้องย่อส่วนเพื่อเรียกคืนพื้นที่ นี่คือข้อความที่ตัดตอนมาจากคู่มือผู้ดูแลระบบ 11.2 เกี่ยวกับการเรียกคืนพื้นที่ที่สูญเปล่า :

เมื่อเวลาผ่านไปการอัปเดตและลบวัตถุในพื้นที่ตารางสามารถสร้างพื้นที่ว่างในกระเป๋าซึ่งมีขนาดไม่ใหญ่พอที่จะนำกลับมาใช้ใหม่สำหรับข้อมูลใหม่ได้ พื้นที่ว่างประเภทนี้เรียกว่าพื้นที่ว่างแบบแยกส่วน

วัตถุที่มีพื้นที่ว่างแบบแยกส่วนอาจส่งผลให้เกิดพื้นที่ว่างเปล่ามากและอาจส่งผลต่อประสิทธิภาพของฐานข้อมูล วิธีที่ดีที่สุดในการจัดระเบียบและเรียกคืนพื้นที่นี้คือการลดขนาดเซ็กเมนต์ออนไลน์ กระบวนการนี้จะรวมพื้นที่ว่างที่อยู่อย่างกระจัดกระจายใต้เครื่องหมายน้ำสูงและทำการบีบอัดเซ็กเมนต์ หลังจากการบดอัดเครื่องหมายน้ำสูงจะถูกย้ายส่งผลให้มีพื้นที่ว่างใหม่เหนือเครื่องหมายน้ำสูง พื้นที่นั้นเหนือเครื่องหมายน้ำสูงจะถูกจัดสรรคืน เซ็กเมนต์ยังคงพร้อมใช้งานสำหรับเคียวรีและ DML ในระหว่างการดำเนินการส่วนใหญ่และไม่จำเป็นต้องจัดสรรพื้นที่ดิสก์เพิ่มเติม

ยิ่งไปกว่านั้นในหน้าเดียวกันคุณสามารถอ่านได้:

การย่อส่วนเป็นแบบออนไลน์การทำงานในสถานที่ การดำเนินการ DML และคิวรีสามารถออกได้ในระหว่างขั้นตอนการเคลื่อนย้ายข้อมูลของการย่อส่วน การดำเนินการ DML พร้อมกันจะถูกบล็อกในช่วงเวลาสั้น ๆ เมื่อสิ้นสุดการดำเนินการย่อขนาดเมื่อพื้นที่ถูกจัดสรรคืน ดัชนีจะถูกเก็บรักษาไว้ในระหว่างการดำเนินการย่อและยังคงใช้งานได้หลังจากการดำเนินการเสร็จสมบูรณ์ การลดขนาดเซกเมนต์ไม่ต้องการพื้นที่ดิสก์เพิ่มเติมเพื่อจัดสรร

ส่วนที่หดจะเรียกคืนพื้นที่ที่ไม่ได้ใช้ทั้งด้านบนและด้านล่างของเครื่องหมายน้ำสูง ในทางตรงกันข้ามการจัดสรรคืนพื้นที่จะเรียกคืนพื้นที่ที่ไม่ได้ใช้งานเหนือเครื่องหมายน้ำสูงเท่านั้น ในการดำเนินการย่อขนาดโดยค่าเริ่มต้นฐานข้อมูลจะบีบอัดเซ็กเมนต์ปรับค่า high water mark และปล่อยพื้นที่ที่เรียกคืน

หน้านี้มีข้อมูลเพิ่มเติมเกี่ยวกับปัญหารวมถึงตัวอย่าง

ส่วน"พื้นที่แบ่งส่วนและเครื่องหมายน้ำสูง"จากคู่มือแนวคิดอาจมีประโยชน์เช่นกัน


9

ใช่มันจะเกิดจากการแตกแฟรกเมนต์

หากต้องการเรียกคืนพื้นที่ก่อนอื่นให้รับรายการตารางในพื้นที่ตารางโดยใช้แบบสอบถามต่อไปนี้ (ละเว้นพาร์ทิชัน - แก้ไขคำถามของคุณหากคุณใช้งาน)

select distinct table_name from dba_tables where tablespace_name = 'DATA';

จากนั้นสำหรับแต่ละตารางเปิดใช้งานการเคลื่อนไหวของแถว:

alter table TABLEINDATAPARTITION enable row movement;

จากนั้นคุณสามารถย่อตาราง:

alter table TABLEINDATAPARTITION shrink space;

จากนั้นย่อขนาดไฟล์ข้อมูลด้วย:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

ชื่อดาต้าไฟล์สามารถดูได้จากDBA_DATA_FILESมุมมองซึ่งคุณได้รับทราบแล้ว


ยอดเยี่ยมคำตอบที่เป็นประโยชน์ +1
Leigh Riffel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.