2016-12-16 82 views
1

我得到了一个有2TB数据的数据库,我想通过删除一些行并删除一些无用的列来将它减少到500Go,但我还有其他的优化想法,我需要一个答案之前有些问题。减少sql数据库的磁盘空间

我的数据库有一个.mdf文件,和另外9个.ndf文件,每个文件的标签大小为100Go。

  1. 我是否应该将每个.ndf文件的初始大小减小到50Go?此操作是否会影响我的数据?
  2. 删除索引有助于减少空间?

PS:我的数据库中只包含一个单一的表,有一个聚集索引和其他两个非聚集索引,

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

如果你有优化的任何其他的想法,那将是非常有益的

+0

如果您的数据库只有一个表 - 而且您没有使用任何关系特性,那么实现您自己的平面文件存储和索引系统可能会更好。 – Dai

+0

您不能减小初始文件大小(除非在最新版本的SQL Server中已更改) – DavidG

+0

因此,您建议我基于第一个数据库创建另一个数据库? –

回答

1

在删除任何索引之前,运行这两个视图。

sys.dm_db_index_usage_stats

sys.dm_db_index_operational_stats中

他们会让你知道,如果其中任何一个被用来支持查询。你想要的最后一件事是删除一个索引并开始在2TB表上看到全表扫描。

如果您无法将表格分解为关系模型,请尝试这些初学者。

  1. 检查您的数据类型。

- 你可以用CHAR或VARCHAR或NCHAR替换NVARCHAR吗? (他们占用了一半的空间)

- 你的桌面体验了很多更新或很多插入(上面的视图会告诉你这个)?如果更新很少,则考虑将CHAR字段更改为VARCHAR字段。繁重的更新可能会导致页面拆分并导致较差的页面丰满度。

- 确认只存储没有时间日期列不声明为日期时间在数字领域,即尝试使用的不是int SMALLINT

- 检查值范围。

  1. 看看表上的活动,更新&插入行为。如果活动意味着很少页面被重新安排,那么考虑增加填充因子。

  2. 看看计划缓存,了解如何查询表,如果大量查询集中在表的特定部分,然后实现过滤索引。

  3. 您的群集索引是否唯一?如果没有,那么SQL会创建一个“隐藏的额外Integer列”,在引擎盖下创建唯一性。

+0

对于数据类型我得到了varchar(22),varbinary(max),一点和日期。 表是一个静态表,它将来不会改变,我只需要聚簇索引来帮助用户对它进行一些快速搜索,并且该列是唯一的。 –

+0

感谢您的好信息,但它并没有帮助我与我的情况:) –

+0

它看起来像varbinary是问题,如果varbinary包含很多重复,那么你可以创建一个“超级维度”,并在您的表中有一个整数,链接到维度中的唯一值。 – pacreely