Sql Server 2008数据库的增长速度超过应有的水平

时间:2014-05-09 02:50:34

标签: sql-server sql-server-2008

我一直在研究这个问题。我有一个ASPDOTNETSTOREFRONT商店。我们目前还拥有500兆的数据库上限。每个月数据库增长约200megs。我被告知要删除一些不需要的数据,除非你有问题。微软想出了以下内容。

Update customer set RTShipResponse = NULL where RTShipResponse is not null
Update customer set RTShipRequest = NULL where RTShipRequest is not null
Update customer set referrer = NULL where referrer is not null

Update orders set RTShipRequest = NULL where RTShipRequest is not null
Update orders set RTShipResponse = NULL where RTShipResponse is not null
Update orders set referrer = NULL where referrer is not null

在我运行上面的脚本之前,数据库总数是450兆。跑完之后,它跳到了730兆。在我缩小它之后,3%的空间结束了435兆。为什么我无法恢复我删除的所有空间?星期六我删除了大约175兆美元,还有一小部分被退回。

最大的表格大小是220 megs如果你将列数据加起来总计低于50 megs。似乎最大的表是我继续运行上面的脚本。运行数据库收缩不会释放任何空间。

去年数据库是700兆,我的主机备份了数据库,并使用不同的名称在另一台服务器上恢复它。一旦恢复,它显示500兆的可用空间。让DB收缩并将其全部收回。

我希望我输入足够的数据,任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

重建表格以回收其中的已释放空间。

ALTER TABLE customer REBUILD;
ALTER TABLE orders REBUILD;
etc.

之后,您将能够使用DBCC SHRINKDATABASE缩小数据库。

答案 1 :(得分:0)

在ASPDNSF中,通常是profile.dbo会增长并导致此问题。每当有人更改数据库中的页面时,profile.dbo都会添加一行。您是否在管理部分内运行每月维护?这应该清理配置文件表作为其中的一部分。但是,根据版本的不同,存在可以阻止此运行的已知错误。

使用此代码查看表格的大小

DECLARE @table table(Id int IDENTITY(1,1)
                , Name varchar(256))

INSERT INTO @table
SELECT b.name + '.'+ a.name
FROM sys.tables a INNER JOIN sys.schemas b
    ON a.schema_id = b.schema_id

INSERT INTO @table
SELECT '-1'

DECLARE @result table(  TableName varchar(256)
                    , TotalRows int
                    , Reserved varchar(50)
                    , DataSize varchar(50)
                    , IndexSize varchar(50)
                    , UnusedSize varchar(50))

DECLARE @temp varchar(256)
DECLARE @index int
SET @index = 1

WHILE 1=1
BEGIN
SELECT @temp = Name
FROM @table
WHERE Id = @index

IF @temp = '-1'
    BREAK       

INSERT @result( TableName
                , TotalRows
                , Reserved
                , DataSize
                , IndexSize
                , UnusedSize)
EXEC sp_spaceused @temp

SET @index = @index + 1
END

SELECT c.name+'.'+b.name as [table]
    , a.*
FROM @result a
    INNER JOIN sys.tables b
        ON a.TableName = b.name
    INNER JOIN sys.schemas c
    ON b.schema_id = c.schema_id
ORDER BY TotalRows DESC

通常这会清除个人资料表

 delete top(50000) from dbo.Profile  where UpdatedOn < '2014-05-01'
 delete top(50000) from dbo.Profile  where UpdatedOn < '2014-05-01'
 delete top(50000) from dbo.Profile  where UpdatedOn < '2014-05-01'
 delete top(50000) from dbo.Profile  where UpdatedOn < '2014-05-01'
 delete top(50000) from dbo.Profile  where UpdatedOn < '2015-05-01'

您可以将其更改为您喜欢的内容。运行每月maint的每个部分的单个SQL在存储过程dbo.aspdnsf_MonthlyMaintenence中

我们的个人资料表曾经95gig!