Sql server 2008 r2 SQL Server Express 2008 10GB大小限制

Sql server 2008 r2 SQL Server Express 2008 10GB大小限制,sql-server-2008-r2,Sql Server 2008 R2,我正在接近Express对主数据库文件的10GB限制 主要问题似乎是一些固定长度的char(500)列从未接近该长度 我有两张桌子,中间大约有200万行。这两个表总计约8GB的数据,其余的数据分布在另外20个左右的表上。这两个表各有2个char(500)列 我正在测试一种将这些列转换为varchar(500)并恢复尾部空格的方法 我试过这个: Alter Table Test_MAILBACKUP_RECIPIENTS Alter Column SMTP_address varchar(500)

我正在接近Express对主数据库文件的10GB限制

主要问题似乎是一些固定长度的
char(500)
列从未接近该长度

我有两张桌子,中间大约有200万行。这两个表总计约8GB的数据,其余的数据分布在另外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)
    列重新创建实际表

  • 把信息复制回来

  • 我愿意接受其他想法,因为在这个过程完成时,我必须让我的应用程序离线

    另一件我很好奇的事情是主键标识列。 此表的主键字段设置为标识。 我知道我必须使用
    设置Identity\u Insert
    打开,以允许将记录插入表中,并在完成后将其关闭


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

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

    我重新启用了我的应用程序,它仍然可以工作。(耶)

    现在查看报告的表大小,它从1.4GB变为126Mb!所以至少这为我赢得了一些时间。 (我用KB圈出了数据大小)

    以前

    之后

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

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

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

    我重新启用了我的应用程序,它仍然可以工作。(耶)

    现在查看报告的表大小,它从1.4GB变为126Mb!所以至少这为我赢得了一些时间。 (我用KB圈出了数据大小)

    以前

    之后

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

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

    最初方法的问题是,您将列转换为
    varchar
    ,但在将列的数据类型更改为后,没有修剪现有的空白(在转换后保留),您应该执行以下操作:

    update Test_MAILBACKUP_RECIPIENTS set
      SMTP_address=rtrim(SMTP_address), EXDN_address=rtrim(EXDN_address)
    
    这将消除表中的所有尾随空间,但请注意,实际磁盘大小将是相同的,因为SQL Server不会自动收缩数据库文件,它只是将该空间标记为未使用且可用于其他数据

    您可以使用另一个问题中的脚本查看DB文件中数据使用的实际空间:

    通常不建议收缩数据库,但当使用的空间和磁盘大小之间存在很大差异时,您可以使用:


    最初方法的问题是,您将列转换为
    varchar
    ,但在将列的数据类型更改为之后,没有修剪现有的空白(在转换后保留),您应该执行以下操作:

    update Test_MAILBACKUP_RECIPIENTS set
      SMTP_address=rtrim(SMTP_address), EXDN_address=rtrim(EXDN_address)
    
    这将消除表中的所有尾随空间,但请注意,实际磁盘大小将是相同的,因为SQL Server不会自动收缩数据库文件,它只是将该空间标记为未使用且可用于其他数据

    您可以使用另一个问题中的脚本查看DB文件中数据使用的实际空间:

    通常不建议收缩数据库,但当使用的空间和磁盘大小之间存在很大差异时,您可以使用:


    嗨,阿尔贝托,这似乎正是我需要做的PP4_邮件备份表。后来我想我应该可以按照你的建议去做,但不知道我是否可以像那样写一篇专栏。有这么大的表,我很难复制测试数据来进行测试。我不需要收缩数据库,因为我不缺少磁盘空间,但这将永远解决我的10Gb限制。我还没有试过,但我会把你的答案作为解决办法。谢谢如果您想首先进行测试,并为临时数据库留出足够的空间,请执行
    开始事务
    ,然后执行更新,并通过选择检查一切是否正常,如果不只是
    回滚
    (或
    提交
    ,以使更改永久化)。为了安全起见,我大部分时间都使用事务来执行此类更新(如果您执行了多次更新,可以使用
    select@@tracount
    检查您是否已经有活动事务)。这是一个好主意。我需要学习如何做这种事情。我应该在临时数据库中有足够的空间,除非它需要在其中存储我的filestream列。我假设tempdb也有一个与主数据库相同的10Gb限制。我不确定tempdb的大小,但可能也被限制为10Gb。关于专栏,这不应该是个问题,因为