在我看来,仅更新列即可NULL
释放页面以供重复使用。这是一个VeryScottish®演示,庆祝它是美国东部时间下午5点左右。
USE tempdb;
DROP TABLE IF EXISTS dbo.RobertBurns;
CREATE TABLE dbo.RobertBurns
(
Id INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
Scotch VARCHAR(50),
HaggisAddress VARBINARY(MAX)
);
DECLARE @AddressToAVarbinaryHaggis VARBINARY(MAX);
DECLARE @AddressToAHaggis NVARCHAR(MAX) = N'
Good luck to you and your honest, plump face,
Great chieftain of the pudding race!
Above them all you take your place,
gut, stomach-lining, or intestine,
You''re well worth a grace
as long as my arm.
The overloaded serving tray there you fill,
Your buttocks shaped like a distant hilltop,
Your wooden skewer could be used to fix a mill
if need be,
While through your pores your juices drip
like liquid gold.
His knife see the serving-man clean,
And then cut you up with great skill,
Making a trench in your bright, gushing guts
To form a ditch,
And then, 0h! What a glorious sight!
Warm, steaming, and rich!
Then, spoonful after spoonful, they eagerly eat,
The devil will get the last bit, on they go,
Until all their well-stretched stomachs, by-and-by,
are bent like drums,
Then the head of the family, about to burst,
murmurs “Thank the Lord".
Is there a pretentious soul who, over his French ragout,
Or Italian cuisine that would make a pig sick,
Or French stew that would make that same pig ill
with complete and utter disgust,
Looks down with a sneering, scornful attitude,
on such a meal? (as Haggis)
Poor devil! See him over his trash!
As feeble as a withered bullrush,
His skinny leg no thicker than a thin rope,
His fist the size of a nut,
Through a river or field to travel,
Completely unfit!
But look at the healthy, Haggis-fed person!
The trembling earth respects him as a man!
Put a knife in his fist,
He''ll make it work!
And legs, and arms, and heads will come off,
Like the tops of thistle.
You Powers who look after mankind,
And dish out his bill of fare,
Old Scotland wants no watery, wimpy stuff
That splashes about in little wooden bowls!
But, if You will grant her a grateful prayer,
Give her a Haggis!';
INSERT dbo.RobertBurns (Scotch, HaggisAddress )
SELECT TOP 1000
CASE WHEN x.c % 15 = 0 THEN 'Laphroaig'
WHEN x.c % 5 = 0 THEN 'Lagavulin'
WHEN x.c % 3 = 0 THEN 'Port Ellen'
ELSE 'Ardbeg'
END AS Scotch,
CONVERT(VARBINARY(MAX), REPLICATE(@AddressToAHaggis, x.c % 20 + 1))
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY @@ROWCOUNT) AS c
FROM sys.messages AS m
) AS x;
CREATE INDEX ix_novarbinary ON dbo.RobertBurns (Scotch, Id);
CREATE INDEX ix_yesvarbinary ON dbo.RobertBurns (Scotch, Id) INCLUDE (HaggisAddress);
插入行后,让我们检查一下索引页。
SELECT OBJECT_NAME(i.object_id) AS table_name,
i.name AS index_name,
MAX(a.used_pages) AS leaf_me_alone
FROM sys.indexes AS i
JOIN sys.partitions AS p
ON p.object_id = i.object_id
AND p.index_id = i.index_id
JOIN sys.allocation_units AS a
ON a.container_id = p.partition_id
WHERE OBJECT_NAME(i.object_id) = 'RobertBurns'
GROUP BY i.object_id, i.index_id, i.name
ORDER BY OBJECT_NAME(i.object_id), i.index_id;
插入后,我得到了。实际页面可能会因您而异。
table_name index_name leaf_me_alone
RobertBurns PK__RobertBu__3214EC074BE633A2 5587
RobertBurns ix_novarbinary 10
RobertBurns ix_yesvarbinary 5581
让我们NULL
出去一些行!
UPDATE rb
SET rb.HaggisAddress = NULL
FROM dbo.RobertBurns AS rb
WHERE rb.Id % 15 = 0;
并重新登录我们的页面:
table_name index_name leaf_me_alone
RobertBurns PK__RobertBu__3214EC074BE633A2 5300
RobertBurns ix_novarbinary 10
RobertBurns ix_yesvarbinary 5273
因此减少了页数。头晕!对于涉及我们VARBINARY
数据的两个索引,它们丢失了很多页面。这意味着它们又重新流通,供其他对象使用。由于我在tempdb中,它们可能很快就被这里发生的所有垃圾事件所吞噬。
现在,让我们将一些数据放回去:
INSERT dbo.RobertBurns (Scotch, HaggisAddress )
SELECT TOP 10 rb.Scotch, rb.HaggisAddress
FROM dbo.RobertBurns AS rb;
然后签入:
table_name index_name leaf_me_alone
RobertBurns PK__RobertBu__3214EC074BE633A2 5330
RobertBurns ix_novarbinary 11
RobertBurns ix_yesvarbinary 5305
页面计数略微增加。
因此,看起来您不必做任何疯狂的事情,甚至不必收缩数据库即可重复使用空间。我认为您正在混淆删除列的行为,并需要根据DBCC CLEANTABLE
实际操作来运行。
希望这可以帮助!