Kami memutuskan untuk menghapus bidang itu dan semua nilainya: Apakah ada cara untuk menghapus bidang ntext dan semua nilainya serta melepaskan ruang tanpa menghapus indeks, tanpa menyusut, tanpa kehilangan kinerja db?
Saya akan merekomendasikan untuk menggunakan (dari BOL:)
DBCC CLEANTABLE
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , batch_size ]
)
[ WITH NO_INFOMSGS ]
DBCC CLEANTABLE mengambil kembali ruang setelah kolom panjang variabel dijatuhkan. Kolom panjang variabel dapat menjadi salah satu dari tipe data berikut: varchar, nvarchar, varchar (max), nvarchar (max), varbinary, varbinary (max), teks, ntext, gambar, sql_variant, dan xml. Perintah tidak mengambil kembali ruang setelah kolom dengan panjang tetap dijatuhkan.
!! HATI-HATI !! ( gunakan ukuran batch yang cermat - disarankan untuk menggunakan parameter ini jika tabel Anda besar-besaran) :
DBCC CLEANTABLE berjalan sebagai satu atau lebih transaksi. Jika ukuran batch tidak ditentukan, perintah memproses seluruh tabel dalam satu transaksi dan tabel dikunci secara eksklusif selama operasi . Untuk beberapa tabel besar, panjang transaksi tunggal dan ruang log yang dibutuhkan mungkin terlalu banyak. Jika ukuran batch ditentukan, perintah dijalankan dalam serangkaian transaksi, masing-masing termasuk jumlah baris yang ditentukan. DBCC CLEANTABLE tidak dapat dijalankan sebagai transaksi di dalam transaksi lain.
Operasi ini sepenuhnya dicatat.
Repro sederhana akan membuktikan bahwa DBCC CLEANTABLE
itu lebih baik daripada MENGHANCURKAN (dan tidak khawatir akan fragmentasi :-)
-- 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') ;