Wir haben beschlossen, dieses Feld und alle seine Werte zu löschen: Gibt es eine Möglichkeit, das ntext-Feld und alle seine Werte zu löschen und Speicherplatz freizugeben, ohne die Indizierung zu entfernen, ohne die Datenbankleistung zu verringern?
Ich würde empfehlen (von BOL:)
DBCC CLEANTABLE
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , batch_size ]
)
[ WITH NO_INFOMSGS ]
DBCC CLEANTABLE beansprucht Speicherplatz zurück, nachdem eine Spalte mit variabler Länge gelöscht wurde. Eine Spalte variabler Länge kann einen der folgenden Datentypen haben: varchar, nvarchar, varchar (max), nvarchar (max), varbinary, varbinary (max), text, ntext, image, sql_variant und xml. Der Befehl beansprucht keinen Speicherplatz mehr, nachdem eine Spalte mit fester Länge gelöscht wurde.
!! VORSICHT !! ( Verwenden Sie eine sorgfältige Stapelgröße - es ist ratsam, diesen Parameter zu verwenden, wenn Ihre Tabelle sehr umfangreich ist) :
DBCC CLEANTABLE wird als eine oder mehrere Transaktionen ausgeführt. Wenn eine Chargengröße wird nicht angegeben, verarbeitet der Befehl die gesamte Tabelle in einer Transaktion und der Tisch ausschließlich während des Betriebes gesperrt ist . Bei einigen großen Tabellen können die Länge der einzelnen Transaktion und der erforderliche Protokollspeicherplatz zu groß sein. Wenn eine Stapelgröße angegeben ist, wird der Befehl in einer Reihe von Transaktionen ausgeführt, die jeweils die angegebene Anzahl von Zeilen enthalten. DBCC CLEANTABLE kann nicht als Transaktion in einer anderen Transaktion ausgeführt werden.
Dieser Vorgang wird vollständig protokolliert.
Eine einfache Reproduktion wird beweisen, dass dies DBCC CLEANTABLE
besser ist als das Schrumpfen (und keine Sorge vor Fragmentierung :-)
-- 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') ;