2017-10-19 436 views
1

我接近Express对主数据库文件的10 GB限制。SQL Server Express 2008 10GB大小限制

主要的问题似乎是一些固定长度的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) 

这迅速改变列的类型,但显然没有恢复的空间。

我可以看到成功地做到这一点的唯一方法是:

  1. varchar(500)列tempdb中创建一个新表,

  2. 复制信息到临时表中修剪掉尾部的空格,

  3. 删除实际表,

  4. 重新创建与新的varchar(500)列的真实表,

  5. 将信息复制回来。

我对这里的其他想法持开放态度,因为我必须在此过程完成时将我的应用程序脱机?

我很好奇的另一件事是主键标识列。 此表具有设置为标识的主键字段。 我知道我必须使用Set Identity_Insert来允许将记录插入表中,并在完成时将其关闭。

如何重新创建表影响完成后插入表中的新记录。或者这只是“微软魔术”,我不需要担心呢?

回答

0

与你最初的方法是,在转换的列varchar但没有修剪现有空格(它在转换之后保持)的问题,改变了列你的数据类型后应该做的:

update Test_MAILBACKUP_RECIPIENTS set 
    SMTP_address=rtrim(SMTP_address), EXDN_address=rtrim(EXDN_address) 

这将消除您表中的所有尾随空格,但请注意实际的磁盘大小将相同,因为SQL Server不会自动收缩数据库文件,只会将该空间标记为未使用并可用于其他数据。

你可以使用这个脚本从另一个问题,看在DB文件中使用的数据的实际空间:

Get size of all tables in database

通常收缩数据库是推荐,但是当有很多的用空间和磁盘大小之间的差异可以用dbcc shrinkdatabase做到这一点:

dbcc shrinkdatabase (YourDatabase, 10) -- leaving 10% of free space for new data 
+0

阿尔贝托嗨,这似乎正是我需要与PP4_MailBackup表做。我后来认为我应该可以做你的建议,但不知道我是否可以像这样写一个专栏。有了这么大的表格,我很难复制测试数据来尝试一些东西。我不需要缩小数据库,因为我不缺少磁盘空间,但这应该可以解决我的10Gb限制。我还没有尝试过,但我会将您的答案标记为解决方案。谢谢! –

+0

如果您想首先进行测试并为temp数据库提供足够的空间来创建'begin transaction',然后执行更新,并选择一切正常,如果不仅仅是'rollback'(或'commit'使变化永久)。为了安全起见,我大多数时间使用事务来执行这种类型的更新(如果您执行多个更新,您可以使用select @@ trancount来检查您是否已经有活动事务)。 –

+0

这是一个好主意。我需要学习如何做这种东西。我应该在临时数据库中有足够的空间,除非它需要将我的文件流列存储在那里。我假设tempdb也会有一个与主数据库相同的10Gb限制。 –

0

好的我做了一个SQL备份,禁用了应用程序,并尝试了我的脚本。 我感到非常震惊,它在我慢的旧服务器上运行了2分钟。

我重新启用了我的应用程序,它仍然有效。 (Yay)

查看表格的报告大小现在从1.4GB变为126Mb!所以至少有一段时间给我买了。 (我已经盘旋在KB的数据大小)

enter image description here

之前之后 enter image description here

我的下一个问题是MailBackup表,也有两个CHAR(500)列。

它显示为6.7GB。 我不能使用相同的方法,因为这个表包含一个FileStream列,它有大约190GB的数据,而据我所知,tempdb不支持FleStream。 看起来这可能是值得一个新的问题。