2012-08-01 23 views
1

我們在刪除數據的while循環中使用「sp_spaceused」。
我們這樣做是爲了保持在10GB SQL Express版限制之下。「sp_spaceused」不返回最新的數字

運行夜間

PROCEDURE [dbo].[DeletePeriod4Data] 
    @LIMIT_InMB AS FLOAT 
AS 
BEGIN 
    SET NOCOUNT ON  

    DECLARE @MinBegin AS DATETIME 
    DECLARE @SizePeriod4_InMB AS FLOAT 

    EXEC [dbo].[GetDatabaseStatsPeriod4MB] 
     @Size_InMB = @SizePeriod4_InMB OUTPUT 

    WHILE @SizePeriod4_InMB > @LIMIT_InMB 
    BEGIN 

     SELECT @MinBegin = MIN(MONTH.ProdData.[Begin]) 
     FROM MONTH.ProdData 


     PRINT 'deleting from period 4, month and year of: ' 
     PRINT @MinBegin 


     DELETE 
     FROM Month.ProdData 
     WHERE 
      Year = DATEPART(YEAR, @MinBegin) 
      AND 
      Month = DATEPART(MONTH, @MinBegin) 


     EXEC [GetDatabaseStatsPeriod4MB] 
      @Size_InMB = @SizePeriod4_InMB OUTPUT 
    END 

END 

這是罪魁禍首存儲過程返回outofdate號碼刪除程序。

PROCEDURE [dbo].[GetDatabaseStatsPeriod4MB] 
    @Size_InMB float OUTPUT 
AS 
BEGIN 
    CREATE TABLE #t (name SYSNAME, rows CHAR(11), reserved VARCHAR(18), 
     data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18)) 

    DBCC UPDATEUSAGE(0); -- <-- helps? 

    EXEC sp_msforeachtable @command1= 
      'INSERT INTO #t EXEC sp_spaceused ''?'', @updateUsage=''TRUE''', 
      @whereand=' and schema_name(schema_id) = ''Month'' ' 


    SELECT @Size_InMB = 
      SUM(CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3)))/1024.0 
    FROM #t 

    DROP TABLE #t 

    PRINT 'PERIODE 4 Size (Month)' 
    PRINT @Size_InMB 


END 

我們嘗試什麼是

  1. 添加參數 「@ UPDATEUSAGE = TRUE」 來註釋sp_spaceused
  2. 添加呼叫 「DBCC UPDATEUSAGE(0);」
  3. 向「DBCC UPDATEUSAGE(0)WITH NO_INFOMSGS,COUNT_ROWS」添加參數;「
  4. 使用延遲之前,我稱之爲「UPDATEUSAGE」
    WAITFOR DELAY '00:00:05' ---- 5秒延遲

通用代碼瑞普問題

CREATE TABLE #t (name SYSNAME, rows CHAR(11), reserved VARCHAR(18), 
    data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18)) 

EXEC sp_msforeachtable @command1= 
    'INSERT INTO #t EXEC sp_spaceused ''?'', @updateUsage=''TRUE''' 

SELECT SUM(CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3)))/1024.0 
    FROM #t 

DROP TABLE #t 

-- Delete something in your DB (Northwind) 

-- Run the above again 

回答

2

由於DELETE實際上並未刪除任何內容,因此您需要考慮Ghost Cleanup處理幻影記錄的時間,它只會將記錄標記爲頁面插槽中的幻影,然後是Ghost Cleanup任務的作業清理那些遲到河您可以在保羅的博客文章瞭解這一點:

Inside the Storage Engine - Ghost Cleanup in Depth

Ghost Cleanup - Redux

Truning off the Ghost Cleanup Task for a Performance Gain

您還可以跟蹤鬼清理活動與SQL Server擴展事件2008+如我在我的博客發帖:

Tracking Ghost Cleanup

您或者需要等待刪除和檢查用於允許運行Ghost Cleanup的空間,或者刪除和檢查所用空間之間的空間,通過強制執行索引掃描強制Ghost清除,Paul在他的博客文章中解釋。