首页 > 解决方案 > SQL Server 表为特定数据类型占用过多空间

问题描述

我的 SQL Server 数据库中有一个表,它有两列:

ItemID1  nvarchar(1200)
ItemID2  nvarchar(1200)

基本上我希望在这里将一个数值存储到它们中(我在创建表几个月后才意识到这一点)。然而,其中一些也是文本 - 不是数字。表大小增长到 12.1GB ......现在大部分都存储在数据库中"Unknown ItemID number"

我现在意识到nvarchar(length)每个字符需要 2 个字节 + 2 个字节来保存字符串的长度)。所以基本上在我的情况下,我的长度为 nvarchar 21(总字符串长度)*2 = 字符串中所有字符的 42 个字节 +2 个字节来保存字符串长度 = 每条记录 44 个字节...

现在我的问题是:

  1. 如果我将这些字符串值更改回 NULL 类型(因为两列都可以为空) - 我会立即节省一些空间并看到它反映在 DB 表大小上吗?

  2. 这是否也会反映 SQL Server 的 RAM 使用情况 - 即。看到 SQL Server 上的 RAM 使用量减少了吗?

感谢大家

标签: sql-serversql-server-2008sql-server-2012storagenvarchar

解决方案


就像评论中提到的那样,您需要在此处修复您的数据类型。就我个人而言,我会分几步来做到这一点。您已在此处标记了,但我假设您没有使用完全不受支持的软件:

--Add a column to replicate bad data
ALTER TABLE dbo.YourTable ADD OldID nvarchar(1200);
GO
--Put bad data in the new column
UPDATE dbo.YourTable
SET OldID = ItemID1
WHERE TRY_CONVERT(int, ItemID1) IS NULL;
GO
--Get rid of bad data in the ID column
UPDATE dbo.YourTable
SET ItemID1 = TRY_CONVERT(int, ItemID1);
GO
ALTER TABLE dbo.YourTable ALTER COLUMN ItemID1 int;
GO
--Review bad data
SELECT OldID
FROM dbo.YourTable
WHERE OldID IS NOT NULL;
GO
--Once reviewed, and action taken, drop the bad column.
ALTER TABLE dbo.YourTable DROP COLUMN OldID;

推荐阅读