2012-06-19 107 views
1

因此,一个很大的问题刚刚出现了我们正在使用的一些数据库。出于某种原因,人们的数据库已经发展到一个荒谬的文件大小,没有任何数据表的变化。虽然我不知道是什么原因突然造成这种情况,但我现在更关心清除其使用的磁盘空间。我运行了sp_spaceused,并且追踪了2个表中的1个(这取决于数据库)的罪魁祸首。对于每个数据库,其中一个表分配超过半个GB到预留空间,而数据只有50 MB。它显示index_size在〜113 MB。该表没有聚簇索引,并且具有大约15列,除了长度为255的nvarchar类型的2列(表中通常为null或空)外,所有长度都相对较小。SQL Server 2000,表分配太多空间

我试过运行DBCC shrinkdatabase和截断表,但它没有做任何事情。我已经研究了这一点,其他一些人也遇到了这个问题,但是如果shrinkdatabase没有解决这个问题,那么他们也找不到解决方案。

让我知道是否还有其他人需要了解表或数据库设置。我不知道还有什么可以尝试的,这对我们来说是一个重大问题,因为人们的数据库突然占据了他们以前的空间的10倍。

编辑: 试图运行DBCC DBREINDEX并试图更改为通过Enterprise Manager聚簇索引后,我得到一个错误消息说:

无法为数据库“DB”分配新页。文件组PRIMARY中不再有可用的页面。可以通过删除对象,添加其他文件或允许文件增长来创建空间。

我试过从这个表中删除行,它对表的大小没有影响。正如预期的那样,日志文件增加,但这是对表格大小的唯一改变。

回答

2

这些是堆(没有聚集索引)?为什么?

如果用户做了很多更新或删除,我会尝试重建表。 Shrinkdatabase不是这样做的方式。它不会修复碎片,删除空间或修改列的宽度,或者将行浪费为转发指针。我敢打赌,重建和/或聚集索引的表格会更好。在SQL Server 2000中,您可以通过以下任一方式执行此操作:

(a)添加聚簇索引。 (我无法给你准确的语法来添加聚集索引(或者更改一个现有索引,或者更改一个现有索引,或者非聚集主键被聚集),因为我没有足够的关于你的表的信息。)

(b)DBCC DBREINDEX('dbo.tablename');

这将重建堆中的非聚簇索引,但这可能会对你造成浪费,这取决于浪费的空间在哪里发生。我仍然建议你应该创建一个聚集索引。如果你可以分享你的表的一些细节(例如存在的索引,通常运行什么类型的查询,当前如何唯一标识一行以及数据更改/添加到表中的性质),我们可能会提供更多详细的建议。

+0

我将如何去重建表或更改为聚集索引?在这个过程中丢失数据是否有风险? – gdawgrancid

+0

正如我所说的,您需要共享关于您的表和现有索引的更多细节,以便获得准确的语法,以及有关列,查询以及如何添加数据的详细信息,如果您希望在上下文中指导您应该放置集群的位置指数。为了将聚集索引添加到堆中,语法就是'CREATE [UNIQUE] CLUSTERED INDEX x ON dbo.y(z);'但是您可能希望主键被聚集,所以语法将会是不同。没有数据丢失的风险,但通常没有任何明确的风险。备份在修改数据库时始终是您最好的朋友。 –

+0

经过一番修改并且必须更改数据库的最大文件大小后,我才能够获得表上的聚集索引,然后DBCC dbshrink在运行几次后就能够缩小大小。我仍然对这件事情有些问题,但我开始认为它与SQL Server 2000的限制或错误有关 – gdawgrancid