我們在刪除數據的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
我們嘗試什麼是
- 添加參數 「@ UPDATEUSAGE = TRUE」 來註釋sp_spaceused
- 添加呼叫 「DBCC UPDATEUSAGE(0);」
- 向「DBCC UPDATEUSAGE(0)WITH NO_INFOMSGS,COUNT_ROWS」添加參數;「
- 使用延遲之前,我稱之爲「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