อ้างสิทธิ์พื้นที่ดิสก์หลังจากลบเขตข้อมูลตาราง


16

ฉันใช้ sql 2008 r2 และ db นั้นทำงานได้ดีและรวดเร็วในช่วง 3 ปีที่ผ่านมาจนถึงประมาณ 3 เดือนที่ผ่านมาเราได้เพิ่มเขตข้อมูล ntext ในตารางที่ใช้งานและใช้งานมาก ตอนนี้เรากำลังเริ่มที่จะออกจากพื้นที่เซิร์ฟเวอร์เนื่องจากขนาดที่ใหญ่ขึ้นของตารางนี้

ฉันอ่านว่าการลดขนาดเราไม่ต้องการทำให้ดัชนีของฐานข้อมูลหลวมเพราะมันทำงานได้อย่างรวดเร็วเป็นเวลาหลายปีและเราไม่ต้องการที่จะได้รับการกระจายตัวของข้อมูล

เราตัดสินใจลบฟิลด์นั้นและค่าทั้งหมด: มีวิธีลบฟิลด์ ntext และค่าทั้งหมดและพื้นที่ปล่อยโดยไม่ต้องลบการทำดัชนีโดยไม่ลดขนาดโดยไม่ลดขนาดประสิทธิภาพ db หรือไม่

ฉันกำลังแนบเอาต์พุตคิวรีขนาด db เพื่อแสดงการขยายขนาดของคุณใน 5 เดือนที่ผ่านมา

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


12

เราตัดสินใจลบฟิลด์นั้นและค่าทั้งหมด: มีวิธีลบฟิลด์ ntext และค่าทั้งหมดและพื้นที่ปล่อยโดยไม่ต้องลบการทำดัชนีโดยไม่ลดขนาดโดยไม่ลดขนาดประสิทธิภาพ db หรือไม่

ฉันอยากจะแนะนำให้ใช้(จาก BOL:)

DBCC CLEANTABLE
(
    { database_name | database_id | 0 }
    , { table_name | table_id | view_name | view_id }
    [ , batch_size ]
)
[ WITH NO_INFOMSGS ]

DBCC CLEANTABLE reclaims space หลังจากคอลัมน์ที่มีความยาวตัวแปรลดลง คอลัมน์ที่มีความยาวตัวแปรสามารถเป็นหนึ่งในชนิดข้อมูลต่อไปนี้: varchar, nvarchar, varchar (สูงสุด), nvarchar (สูงสุด), varbinary, varbinary (สูงสุด), ข้อความ, ntext, รูปภาพ, sql_variant และ xml คำสั่งไม่เรียกคืนพื้นที่หลังจากที่ทิ้งคอลัมน์ที่มีความยาวคงที่ไว้

!! ข้อควรระวัง !! ( ใช้ขนาดแบตช์อย่างระมัดระวัง - แนะนำให้ใช้พารามิเตอร์นี้หากตารางของคุณมีขนาดใหญ่มาก) :

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

การดำเนินการนี้ถูกบันทึกอย่างสมบูรณ์

การจำลองแบบง่าย ๆ จะพิสูจน์ได้ว่าDBCC CLEANTABLEดีกว่าการหดตัว (และไม่ต้องกังวลกับการแตกแฟรกเมนต์ :-)

-- clean up
drop table dbo.Test

-- create test table with ntext column that we will drop later
create table dbo.Test (
    col1 int
    ,col2 char(25)
    ,col3 ntext
    );

-- insert  1000 rows of test data
declare @cnt int;

set @cnt = 0;

while @cnt < 1000
begin
    select @cnt = @cnt + 1;

    insert dbo.Test (
        col1
        ,col2
        ,col3
        )
    values (
        @cnt
        ,'This is a test row # ' + CAST(@cnt as varchar(10)) + 'A'
        ,REPLICATE('KIN', ROUND(RAND() * @cnt, 0))
        );
end

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

--drop the ntext column
ALTER TABLE dbo.Test DROP COLUMN col3 ;

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

--reclaim the space from the table
-- Note that my table is only having 1000 records, so I have not used a batch size
-- YMMV .. so find a maintenance window and you an appropriate batch size 
-- TEST TEST and TEST before implementing in PROD.. so you know the outcome !!
DBCC CLEANTABLE('tempdb', 'dbo.Test') ;

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


หลังจากที่คุณดำเนินการคำสั่ง DBCC CLEANTABLE แล้วคุณจะต้องสร้างดัชนีคลัสเตอร์ของคุณอีกครั้งในกรณีที่ตารางมีหนึ่งเพื่อที่จะได้พื้นที่กลับมา เปลี่ยนดัชนีชื่อบน YourTable REBUILD;
Mr. TA

6

สำหรับชิ้นส่วนส่วนใหญ่ที่ฉันอ้างถึง Paul Randall's Insideซีรีส์บล็อกเครื่องมือจัดเก็บ

วิธีเดียวที่จะเรียกคืนพื้นที่ที่ไม่ได้ใช้จากไฟล์ฐานข้อมูลใน SQLServer คือการใช้คำสั่ง DBCC SHRINK ซึ่งทำการจัดสรรข้อมูลใหม่ภายในไฟล์ฐานข้อมูลจะทำให้หน้าว่างและหลังจากลบออกจากแผนที่ Global Allcation จะลบออกจากไฟล์ฐานข้อมูล การดำเนินการนี้ช้าสร้างการแตกแฟรกเมนต์ภายในฐานข้อมูลและช้าลงเมื่อจัดการกับหน้า LOB เนื่องจากจัดเก็บเป็นรายการที่ลิงก์ภายในไฟล์ฐานข้อมูล

เนื่องจากคุณกำลังทิ้งคอลัมน์ NTEXT คุณจะต้องรอให้กระบวนการล้างข้อมูลบน Ghost เพื่อปล่อยข้อมูลก่อนที่จะย่อขนาดลง

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

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


กระบวนการล้างข้อมูลบน Ghost จะลดพื้นที่หรือลดขนาดลงหรือไม่
user1021182

คุณจะต้องหดตัวลงเสมอกระบวนการล้างข้อมูลจะล้างหน้าที่จัดสรรไว้เท่านั้น แต่จะไม่ลบออกจากไฟล์ฐานข้อมูล
Spörri

1
@ Spörri Since you are dropping the NTEXT column you will have to wait for the ghost cleanup process to drop the data before shrinking.โปรดดูคำตอบของฉัน คุณสามารถใช้DBCC CLEANTABLEเพื่อปล่อยพื้นที่
Kin Shah

4

คุณต้องการลดขนาดไฟล์ฐานข้อมูลเนื่องจากคุณต้องการพื้นที่สำหรับฐานข้อมูลอื่น ๆ / ไฟล์ที่ไม่ใช่ฐานข้อมูลหรือเพราะคุณมีปัญหากับฐานข้อมูลนี้มีพื้นที่เหลืออยู่หรือไม่?

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


เราเหลือเนื้อที่เพียง 10GB และมันก็จะหมดลงในอีกไม่กี่วัน เราได้ลบสิ่งที่เราสามารถลบออกจากเซิร์ฟเวอร์และใช้การสะสางและหยุดการปรับปรุง windows และทำการติดตั้งใหม่ทั้งหมดและล้าง winsxs ตอนนี้เราต้องลดขนาดของไฟล์ db
user1021182

โปรดจำไว้อีกครั้งว่าเมื่อคุณลบคอลัมน์พิเศษแล้วการเติบโตของฐานข้อมูลของคุณจะหยุดชั่วขณะหนึ่งขณะที่คุณเติมพื้นที่ใหม่ที่คุณปลดปล่อย หากฐานข้อมูลของคุณยังคงเติบโตหลังจากจุดนี้คุณจะต้องใช้พื้นที่ดิสก์เพิ่มเติมสำหรับฐานข้อมูลของคุณ อาจเพิ่มไดรฟ์ใหม่ไปยังเซิร์ฟเวอร์ของคุณ
Kenneth Fisher

0

ฉันจะสร้างตารางมิเรอร์โดยไม่มีคอลัมน์ที่ไม่เหมาะสมคัดลอกข้อมูลทั้งหมดลงในตารางนี้วางต้นฉบับแล้วเปลี่ยนชื่อตารางมิเรอร์


ในกรณีนั้นดัชนีทั้งหมดจะต้องมีการเตรียมไว้
user1021182

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