เราตัดสินใจลบฟิลด์นั้นและค่าทั้งหมด: มีวิธีลบฟิลด์ 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') ;