我接近Express对主数据库文件的10 GB限制。
主要问题似乎是一些永远不会接近该长度的固定长度char(500)
列。
我有两个表,它们之间有大约200万行。这两个表总计大约8 GB的数据,其余的分布在另外20个表左右。这两个表每个都有2个char(500)
列。
我正在测试一种将这些列转换为varchar(500)
并恢复尾随空格的方法。
我试过了:
Alter Table Test_MAILBACKUP_RECIPIENTS
Alter Column SMTP_address varchar(500)
GO
Alter Table Test_MAILBACKUP_RECIPIENTS
Alter Column EXDN_address varchar(500)
这很快改变了列类型,但显然没有恢复空间。
我能看到成功完成此任务的唯一方法是:
使用varchar(500)
列在tempdb中创建一个新表
将信息复制到临时表中,修剪尾随空格
放下真实的桌子,
使用新的varchar(500)
列
将信息复制回来。
我对这里的其他想法持开放态度,因为我必须在此过程完成时让我的应用程序脱机?
我很好奇的另一件事是主键标识列。
此表将主键字段设置为标识。
我知道我必须使用Set Identity_Insert
来允许将记录插入到表中并在我完成时将其关闭。
在我完成后,如何重新创建表会影响插入表中的新记录。或者这只是“微软魔术师”,我不需要担心它?
答案 0 :(得分:0)
好的,我做了SQL备份,禁用了应用程序并尝试了我的脚本。 我很震惊,它在我缓慢的旧服务器上运行了不到2分钟。
我重新启用了我的应用程序,它仍然有效。 (耶)
查看报告的表格大小,现在从1.4GB增加到126Mb!所以至少那给我带来了一些时间。 (我用KB表示数据大小)
我的下一个问题是MailBackup表,它还有两个char(500)列。
显示为6.7GB。 我不能使用相同的方法,因为这个表包含一个FileStream列,它有大约190gb的数据,据我所知,tempdb不支持FleStream。 看起来这可能值得一个新问题。
答案 1 :(得分:0)
初始方法的问题是您将列转换为varchar
但未修剪现有的空格(在转换后保留),在更改列的数据类型后应该执行此操作:
update Test_MAILBACKUP_RECIPIENTS set
SMTP_address=rtrim(SMTP_address), EXDN_address=rtrim(EXDN_address)
这将消除您表中的所有尾随空格,但请注意实际磁盘大小将相同,因为SQL Server不会自动收缩数据库文件,它只是将该空间标记为未使用且可用于其他数据。 / p>
您可以使用其他问题中的此脚本查看数据库文件中数据使用的实际空间:
Get size of all tables in database
通常缩小数据库是而不是,但是当使用的空间和磁盘大小有很大差异时,可以使用dbcc shrinkdatabase
来完成:
dbcc shrinkdatabase (YourDatabase, 10) -- leaving 10% of free space for new data