2016-12-05 6 views
0

私たちは、SQL Server 2012 ExpressをDBエンジンとして使用するアプリケーションのクラウドバージョンを運用しています。各クライアントにはSQL Serverの独自のインスタンスがあり、インスタンスがExpressで制限された1GBの完全メモリを使用できるようになり、データベースサイズが10GBになります。SQL Server Expressのメンテナンスの提案

これらのデータベースを最適化し、クライアントに最大のデータストレージを提供し、中断させることなく対処することが課題です。言い換えれば、私たちは実際のデータに対してExpressデータベースをほぼ10GB提供しようとしていますが、パフォーマンスの最適化を維持するためにメンテナンスを実行する必要があります。

毎週日曜日の夜、私たちは以下のような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の制限までプッシュすることです。これにより、値を追加する必要があるテーブルの領域を割り当てることができない可能性があるため、問題が発生します。私たちは戻って、私の理解から、インデックスの最適化/メンテナンスのいくつかの利点を元に戻すDBを縮小して縮小する必要があります。

データファイルに10GBの制限があり、DBの動作を十分に維持するためにメンテナンスを実行する必要がある場合、後でデータベースを縮小することなくメンテナンスのメリットを得るにはどうすればよいですか?

我々は10%で、シンプル復旧モード、無自動圧縮、および自動拡張を使用している

は、事前にありがとうございます!

答えて

0

縮小データベースを使用しないでください。断片化に寄与するには、それをもう一度成長させるために縮小することには役に立たない。ごくまれに何かの後にShrinkfileを実行する必要はまったくありません。また、自動成長を減らすために、データファイルを7GBに設定することもできます。リカバリが簡単なので、ログファイルが大きくなりすぎることはありません。ここで言われているのは、あなたが夜間に走れる、まっすぐな保守計画です。また、あなたはSORT_IN_TEMPDBオプションが表示された多くの研究の後

+0

フィードバックをいただきありがとうございます。インデックスの再編成と再構築を実行した場合、SQL Expressを使用しているため、dbサイズの制限があり、クライアントはデータベースにデータを入力できません。 基本的にメンテナンスを実行すると、DBは10GB近くになり、クライアントはデータを入力できなくなります。これを克服する方法についての考え? – Shaun

+0

再インデックス操作でストレージの制限が満たされている場合は、ストレージの購入を検討する必要があります。 10GBはそれほどではなく、スペースは今日までに安くなっています。再インデックスのためにtempdbを使用するか使用しないなどの操作中および作業後にディスクスペースのサイズを減らすことができる設定がいくつかありますが、ディスクスペースでハード制限が発生しています。 –

+0

こんにちはロス、それは実際にはディスクの容量制限ではない、それは私が打っているSQL ExpressのDBサイズの制限です。少し拡張したり、再インデックス化のためにtempdbを使用するかどうかについてのリソースへのリンクを提供できますか? – Shaun

1

を助けるかどうかを確認したい場合がありますTempDBの でdba exchange

ソートでかなり明確な答えを乗り越えること

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

その再編成では、実行時にデータベースファイルに多くのスペースを使用しません。

私は、これらの命令の組み合わせを使用して、それらが参照したSQLメンテナンススクリプトを使用してしまいました。これは、再編成または再構築を決定する方法がはるかに優れています。 https://www.brentozar.com/archive/2013/09/index-maintenance-sql-server-rebuild-reorganize/

関連する問題