【问题标题】:Best Way To Prepare A Read-Only Database准备只读数据库的最佳方法
【发布时间】:2026-01-23 10:30:01
【问题描述】:

我们正在使用我们的一个生产数据库并在另一台服务器上创建一个副本以用于只读目的。只读数据库位于 SQL Server 2008 上。一旦数据库位于新服务器上,我们希望对其进行优化以供只读使用。

一个问题是为一些未使用的表分配了大量空间。我预计的另一个问题是索引的碎片化。我不确定表碎片是否是一个问题。

涉及哪些问题?解决此问题的最佳方法是什么? SQL Server 中是否包含有帮助的存储过程?我试过运行 DBCC SHRINKDATABASE,但没有释放未使用的空间。

编辑:我用来收缩数据库的确切命令是

DBCC SHRINKDATABASE (dbname, 0)
GO

它运行了几个小时。当我使用 sp_spaceused 检查表空间时,没有释放任何未使用的空间。

【问题讨论】:

  • 不指定可用空间,请尝试以下操作:DBCC SHRINKDATABASE (DBName, TRUNCATEONLY);

标签: sql-server performance database-design


【解决方案1】:

你可以做几件事:

首先——不要担心绝对分配的数据库大小,除非你的磁盘空间不足。

第二——Idera 有很多很酷的 SQL Server 工具,其中之一是对数据库进行碎片整理。 http://www.idera.com/Content/Show27.aspx

第三——删除和重新创建聚集索引本质上也会对表进行碎片整理——它会重新创建所有非聚集索引(也对它们进行碎片整理)。请注意,这可能会扩大您数据库的分配大小(同样,不用担心)并且需要很长时间(聚集索引重建成本很高)。

【讨论】:

    【解决方案2】:

    您可能希望考虑的一件事是将数据库的恢复模式更改为简单。如果您不打算对数据库执行任何写入活动,那么您也可以从事务日志的自动截断中受益,并消除使用其他恢复模型的管理开销。如果您进行任何重大的结构更改(例如对索引),您始终可以执行临时备份。

    您可能还希望将未使用的表放在一个单独的文件组中,远离将要访问的数据文件。或许可以考虑将未使用的表放在较低级别的磁盘存储上,以节省成本。

    使用 DBCC SHRINKDATABASE 需要考虑的一些事项,您不能缩小数据库的最小大小。

    尝试按以下形式发出语句。

    DBCC SHRINKDATABASE (DBName, TRUNCATEONLY);
    

    干杯,约翰

    【讨论】:

    • 数据库的最小大小远小于其中的数据量。我会尝试 TRUNCATEONLY 选项。谢谢!
    • @Eric Ness:好东西,让我知道你过得怎么样。
    【解决方案3】:

    我认为从备份中重新创建它就可以了。

    tablesindexes 放在单独的物理磁盘上也总是有帮助的。当您在另一个文件组上重新创建索引时,它们将从头开始重建,因此不会碎片化。

    【讨论】:

      【解决方案4】:

      MSSQL Server 中有一个用于缩小或截断数据库的工具。我想你选择数据库的属性,你会找到它。这可以在您复制备份之前或之后完成。

      某些形式的复制也可以按照您的意愿进行。

      【讨论】:

        最近更新 更多