Sql server 减少sql数据库的磁盘空间

Sql server 减少sql数据库的磁盘空间,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个数据库,有2TB的数据,我想通过删除一些行和删除一些无用的列,把它减少到500Go,但我有其他优化的想法,我需要一些问题的答案 我的数据库有一个.mdf文件,还有9个.ndf文件,每个文件的初始值都是100Go 我是否应该将每个.ndf文件的初始值大小减少到50Go?此操作会影响我的数据吗 删除索引有助于减少空间 PS:我的数据库只包含一个表,其中有一个聚集索引和两个其他非聚集索引 我想删除两个非聚集索引 删除insertdate列 如果您对优化有任何其他想法,在删除任何索引之前运行

我有一个数据库,有2TB的数据,我想通过删除一些行和删除一些无用的列,把它减少到500Go,但我有其他优化的想法,我需要一些问题的答案

我的数据库有一个.mdf文件,还有9个.ndf文件,每个文件的初始值都是100Go

  • 我是否应该将每个.ndf文件的初始值大小减少到50Go?此操作会影响我的数据吗
  • 删除索引有助于减少空间
  • PS:我的数据库只包含一个表,其中有一个聚集索引和两个其他非聚集索引

    • 我想删除两个非聚集索引
    • 删除insertdate列

    如果您对优化有任何其他想法,在删除任何索引之前运行这两个视图将非常有用

    sys.dm\u db\u索引\u使用情况\u统计数据

    sys.dm_db_index_operation_stats

    它们会让您知道是否有任何一个用于支持查询。您最不希望看到的是删除索引并开始在2TB表上看到完整的表扫描

    如果您不能将表拆分为关系模型,那么首先尝试这些方法

  • 检查您的数据类型
  • -你能用VARCHAR替换NVARCHAR还是用CHAR替换NCHAR?(它们占据了一半的空间)

    -您的表是否经历了大量的更新或插入(上面的视图会告诉您这一点)?如果很少有更新,那么考虑将char字段改为vARCHAR字段。大量更新可能会导致页面分割,并导致页面满度不佳

    -检查仅存储无时间日期的列是否未声明为Datetime

    -检查数值字段中的值范围,即尝试使用Smallint而不是Int

  • 查看表上的活动,更新和插入行为。如果活动意味着很少的页面被重新排列,那么考虑增加填充因子。
  • 查看计划缓存,了解表是如何被查询的,如果大部分查询集中在表的特定部分,那么实现一个过滤索引

  • 你的聚集索引是唯一的吗?如果不是,SQL将创建一个“隐藏的额外整数列”,该列将在引擎盖下创建唯一性


  • 如果您的数据库只有一个表,并且您没有使用任何关系功能,那么最好实现自己的平面文件存储和索引系统。您不能减少初始文件大小(除非在最新版本的SQL Server中更改了该大小)因此,您建议我在第一个数据库的基础上创建另一个数据库?您可以考虑在删除记录后缩小数据库以恢复由于碎片造成的存储。@Souregi如果运行
    exec sp_spaceused'tablename'
    ,您将看到表上索引的总大小。对于数据类型,我得到了一个varchar(22),一个变量二进制(max)、一个位和一个日期。该表是一个静态表,将来不会更改,我只需要使用聚集索引来帮助用户对其进行快速搜索,并且该列是唯一的。感谢您提供的好信息,但它对我的案例没有帮助:)看起来varbinary是个问题,如果varbinary包含大量重复项,则可以创建一个“超级维度”,并在表中创建一个链接到维度中唯一值的整数。varbinary包含文件,每个文件都不同于其他文件。您在SQL Enterprise上吗?您可以使用压缩表。