sql-server - 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 个字节...
现在我的问题是:
如果我将这些字符串值更改回 NULL 类型(因为两列都可以为空) - 我会立即节省一些空间并看到它反映在 DB 表大小上吗?
这是否也会反映 SQL Server 的 RAM 使用情况 - 即。看到 SQL Server 上的 RAM 使用量减少了吗?
感谢大家
解决方案
就像评论中提到的那样,您需要在此处修复您的数据类型。就我个人而言,我会分几步来做到这一点。您已在此处标记了sql-server-2008和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;
推荐阅读
- shell - 使用文件中的 shell 脚本修改文件名并添加扩展名
- python - 如何在python中使用格式化?
- microservices - 如何确保将消息放入消息队列?
- java - 如何在发送从 reactor kafka 主题消耗的前 100 条消息后有条件地发布额外的 SSE Web Flux 事件
- reactjs - 将 Grafana Dashboard 嵌入到 ReactJS 应用程序
- python - Zeromq 多个订阅者
- mysql - 在 phpmyadmin 中导入表时出现此错误。我该如何解决?
- postgresql - 如何在使用rails6中的连接执行基于转换表字段的排序时获取当前的语言环境数据而不是全部
- google-analytics - 使用 gtag.js 在 Google Analytics 中设置用户角色
- android - 数据绑定类型不匹配