我們運行我們的應用程序的雲版本,它使用SQL Server 2012 Express作爲數據庫引擎。每個客戶端都有自己的SQL Server實例,允許他們的實例使用由Express限制的全部1GB內存,併爲他們提供10GB的數據庫大小。SQL Server Express的維護建議
我們面臨的挑戰是保持這些數據庫的優化,同時允許爲客戶端提供最大的數據存儲並且不會中斷。換句話說,我們試圖給他們幾乎所有10GB的Express數據庫作爲他們的實際數據,但是我們需要運行維護來保持性能優化,並且它增長了數據庫,有時這麼大以至於維護失敗。
每個星期天晚上我們運行一個SQL維護腳本,如下所示。
BEGIN;
FETCH NEXT FROM partitions INTO @objectid, @indexid, @partitionnum, @frag;
IF @@FETCH_STATUS < 0
BREAK;
SELECT @objectname = o.name, @schemaname = QUOTENAME(s.name)
FROM sys.objects AS o
JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid;
SELECT @indexname = QUOTENAME(name)
FROM sys.indexes
WHERE object_id = @objectid AND index_id = @indexid;
SELECT @partitioncount = count (*)
FROM sys.partitions
WHERE object_id = @objectid AND index_id = @indexid;
-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.
IF @frag < 30.0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
IF @frag >= 30.0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF);'
IF @partitioncount > 1
SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));
EXEC (@command);
PRINT 'Executed: ' + @command;
SET @COMMAND = 'USE DATA UPDATE STATISTICS Data.dbo.' [email protected] + ';'
EXEC (@COMMAND)
PRINT 'Executed: ' + @command;
PRINT @objectname + 'Index Name: ' + @IndexName + 'Percent Fragmented: ' + CAST(@Frag AS VARCHAR(20))
END;
維護工作正常,如果有可用空間,問題是,它膨脹的數據庫,並推動客戶高達10GB的極限。這會導致問題,因爲它們可能無法爲需要添加值的表分配空間。然後,我們必須回去嘗試縮小數據庫,這從我的理解中,然後取消了索引碎片整理/維護的一些好處。
鑑於10GB限制上的數據文件,並需要運行維護,以保持數據庫的充分運行,有什麼能/應該怎樣做才能得到維護方面的優勢,而不必事後收縮數據庫?
我們使用簡單恢復模式,沒有自動收縮,自動增長和10%的
預先感謝您!
謝謝你的反饋,但是如果我運行索引的重新組織和重建,因爲我使用SQL Express,我的數據庫大小限制被擊中,然後我的客戶端無法將數據輸入到數據庫中。 所以基本上維持運行,DB是現在的近10GB和客戶端不再能進入的數據?有關如何克服這個問題的想法? – Shaun
如果reindex操作正在推動您的存儲限制,那麼您可能需要考慮購買更多存儲。 10GB沒有那麼多,而且空間越來越便宜。有些設置可能會減少操作期間和之後的磁盤空間大小,例如使用或不使用tempdb進行重新索引,但是,您正在使用磁盤空間實現硬約束。 –
嗨Ross,它實際上不是磁盤空間限制,而是我碰到的SQL Express數據庫大小限制。你可以稍微擴展一下,或者提供一個關於「使用或不使用tempdb進行重新索引」的能力的鏈接? – Shaun