SQL 服务器 table 对特定数据类型占用过多 space
SQL Server table taking too much space for specific data type
我的 SQL 服务器数据库中有一个 table,它有两列:
ItemID1 nvarchar(1200)
ItemID2 nvarchar(1200)
基本上我希望这里存储一个数值(我在创建 table 几个月后才意识到这一点)。然而,其中一些也是文本——不是数字。 table 大小增长到 12.1GB ...并且其中大部分现在存储在数据库中为 "Unknown ItemID number"
我现在意识到 nvarchar(length)
每个字符需要 2 个字节 + 2 个字节来保存字符串的长度)。所以基本上在我的情况下,我有 nvarchar 21 的长度(总字符串长度)*2 = 42 字节用于字符串中的所有字符 +2 字节来保存字符串长度 = 44 字节每条记录...
现在我的问题是:
如果我要将这些字符串值更改回 NULL 类型(因为两列都可以为空)- 我会立即保存一些 space 并看到它反映在数据库中吗 table尺码?
这是否也会反映 SQL 服务器的 RAM 使用情况 - 即。看到 SQL 服务器上的 RAM 使用量减少了吗?
谢谢大家
如评论中所述,您需要在此处修复数据类型。我个人会分几步完成。你在这里标记了两个 sql-server-2008 and sql-server-2012,但我 假设 你没有使用完全不受支持的软件:
--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;
我的 SQL 服务器数据库中有一个 table,它有两列:
ItemID1 nvarchar(1200)
ItemID2 nvarchar(1200)
基本上我希望这里存储一个数值(我在创建 table 几个月后才意识到这一点)。然而,其中一些也是文本——不是数字。 table 大小增长到 12.1GB ...并且其中大部分现在存储在数据库中为 "Unknown ItemID number"
我现在意识到 nvarchar(length)
每个字符需要 2 个字节 + 2 个字节来保存字符串的长度)。所以基本上在我的情况下,我有 nvarchar 21 的长度(总字符串长度)*2 = 42 字节用于字符串中的所有字符 +2 字节来保存字符串长度 = 44 字节每条记录...
现在我的问题是:
如果我要将这些字符串值更改回 NULL 类型(因为两列都可以为空)- 我会立即保存一些 space 并看到它反映在数据库中吗 table尺码?
这是否也会反映 SQL 服务器的 RAM 使用情况 - 即。看到 SQL 服务器上的 RAM 使用量减少了吗?
谢谢大家
如评论中所述,您需要在此处修复数据类型。我个人会分几步完成。你在这里标记了两个 sql-server-2008 and sql-server-2012,但我 假设 你没有使用完全不受支持的软件:
--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;