2016-12-05 89 views
0

我們運行我們的應用程序的雲版本,它使用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%的

預先感謝您!

回答

0

不要做收縮數據庫。縮小它只是爲了再次增長而導致碎片化,沒有用處。很少,你會需要執行一個Shrinkfile,如在一些不尋常的事情之後。另外,爲了減少自動增長,您可以繼續設置數據文件爲7GB。既然你的恢復很簡單,那麼你的日誌文件不會真的變得太大。這裏說的是一個相當簡單的維護計劃,你可以每晚運行。

•Check Database Integrity 
•Shrink the Log File – (This is ok because recovery mode is Simple) 
•Reorganize Index 
•Rebuild Index 
•Update Statistics 
•Clean Up History 

您也可以在dba exchange

排序在tempdb 得到相當明確的答案了你可能想看看是否SORT_IN_TEMPDB選項將大量的研究出現後幫助

+0

謝謝你的反饋,但是如果我運行索引的重新組織和重建,因爲我使用SQL Express,我的數據庫大小限制被擊中,然後我的客戶端無法將數據輸入到數據庫中。 所以基本上維持運行,DB是現在的近10GB和客戶端不再能進入的數據?有關如何克服這個問題的想法? – Shaun

+0

如果reindex操作正在推動您的存儲限制,那麼您可能需要考慮購買更多存儲。 10GB沒有那麼多,而且空間越來越便宜。有些設置可能會減少操作期間和之後的磁盤空間大小,例如使用或不使用tempdb進行重新索引,但是,您正在使用磁盤空間實現硬約束。 –

+0

嗨Ross,它實際上不是磁盤空間限制,而是我碰到的SQL Express數據庫大小限制。你可以稍微擴展一下,或者提供一個關於「使用或不使用tempdb進行重新索引」的能力的鏈接? – Shaun