私のデータベースのサイズは約200Gであり、負荷が高く、毎日多くの挿入が行われます(毎日約3〜4 GB増加します)が、自動拡張設定は1 MBに設定されています。
これは問題だと思います。1GBに設定すると、パフォーマンスと機能が向上すると思いますか?
1MBの自動拡張では、データベースは常に新しいスペースを割り当てるためにビジーになると思いますが、そうですか?パフォーマンスを向上させる最良の実用的な方法について何か提案はありますか?
皆さんありがとう
データベースが約1G増加することがわかったので、あなたは正しいです。自動拡張の設定を1MBに保つのは本当に悪いことです。 SQL Serverが自動拡張イベントを実行する場合、自動拡張イベントをトリガーしたトランザクションは、自動拡張イベントが完了するまで待機してからでないと、トランザクションを完了できません。これらの自動拡張イベントにより、自動拡張イベントが発生しているときにパフォーマンスが少し低下します。このため、データベースのサイズを適切に設定して、自動拡張イベントがほとんど発生しないようにすることが最善です。
データファイルのファイル初期化が あることを確認してください
最善の方法は、データベースのサイズを事前に設定して、自動拡張イベントが発生しないようにすることです。たとえば、1か月で30Gまで増加することがわかっている場合は、事前にそのスペースをデータファイルに割り当ててください。
以下のクエリを使用して、自動拡張イベントを確認できます。このクエリは このリンクから取得されます 時間をかけてこの記事をお読みください。
DECLARE @filename NVARCHAR(1000);
DECLARE @bc INT;
DECLARE @ec INT;
DECLARE @bfn VARCHAR(1000);
DECLARE @efn VARCHAR(10);
-- Get the name of the current default trace
SELECT @filename = CAST(value AS NVARCHAR(1000))
FROM ::fn_trace_getinfo(DEFAULT)
WHERE traceid = 1 AND property = 2;
-- rip apart file name into pieces
SET @filename = REVERSE(@filename);
SET @bc = CHARINDEX('.',@filename);
SET @ec = CHARINDEX('_',@filename)+1;
SET @efn = REVERSE(SUBSTRING(@filename,1,@bc));
SET @bfn = REVERSE(SUBSTRING(@filename,@ec,LEN(@filename)));
-- set filename without rollover number
SET @filename = @bfn + @efn
-- process all trace files
SELECT
ftg.StartTime
,te.name AS EventName
,DB_NAME(ftg.databaseid) AS DatabaseName
,ftg.Filename
,(ftg.IntegerData*8)/1024.0 AS GrowthMB
,(ftg.duration/1000)AS DurMS
FROM ::fn_trace_gettable(@filename, DEFAULT) AS ftg
INNER JOIN sys.trace_events AS te ON ftg.EventClass = te.trace_event_id
WHERE (ftg.EventClass = 92 -- Date File Auto-grow
OR ftg.EventClass = 93) -- Log File Auto-grow
ORDER BY ftg.StartTime
自動拡張には1 MBは適切ではありません。
自動拡張は常に、環境に適した実用的な値に設定する必要があります。私は1か月の自動成長値を取得し、それを平均してデータベースの自動成長の球場図を表示する傾向があります。
ここにもサンプルスクリプトを用意しました。Mike Walshの回答 も参照してください。
デフォルトのトレースは、そのままでAUTOGROWTHイベントを追跡します。以下のスクリプトは、良い出発点になります。
また、 インスタントファイルの初期化 は、自動拡張が開始されたときの恩恵です(データファイルにのみ適用されます)。
IF OBJECT_ID('tempdb..#autogrowthTotal') IS NOT NULL
DROP TABLE #autogrowthTotal;
IF OBJECT_ID('tempdb..#autogrowthTotal_Final') IS NOT NULL
DROP TABLE #autogrowthTotal_Final;
DECLARE @filename NVARCHAR(1000);
DECLARE @bc INT;
DECLARE @ec INT;
DECLARE @bfn VARCHAR(1000);
DECLARE @efn VARCHAR(10);
-- Get the name of the current default trace
SELECT @filename = CAST(value AS NVARCHAR(1000))
FROM ::fn_trace_getinfo(DEFAULT)
WHERE traceid = 1 AND property = 2;
-- rip apart file name into pieces
SET @filename = REVERSE(@filename);
SET @bc = CHARINDEX('.',@filename);
SET @ec = CHARINDEX('_',@filename)+1;
SET @efn = REVERSE(SUBSTRING(@filename,1,@bc));
SET @bfn = REVERSE(SUBSTRING(@filename,@ec,LEN(@filename)));
-- set filename without rollover number
SET @filename = @bfn + @efn
-- process all trace files
SELECT
ftg.StartTime
,te.name AS EventName
,DB_NAME(ftg.databaseid) AS DatabaseName
,ftg.[FileName] as LogicalFileName
,(ftg.IntegerData*8)/1024.0 AS GrowthMB
,(ftg.duration/1000)AS DurMS
,mf.physical_name AS PhysicalFileName
into #autogrowthTotal
FROM ::fn_trace_gettable(@filename, DEFAULT) AS ftg
INNER JOIN sys.trace_events AS te ON ftg.EventClass = te.trace_event_id
join sys.master_files mf on (mf.database_id = ftg.databaseid) and (mf.name = ftg.[FileName])
WHERE (ftg.EventClass = 92 -- Data File Auto-grow
OR ftg.EventClass = 93) -- Log File Auto-grow
ORDER BY ftg.StartTime
select count(1) as NoOfTimesEventFired
, CONVERT(VARCHAR(10), StartTime, 120) as StartTime
, EventName
, DatabaseName
, [LogicalFileName]
, PhysicalFileName
, SUM(GrowthMB) as TotalGrowthMB
, SUM(DurMS) as TotalDurationMS
into #autogrowthTotal_Final
from #autogrowthTotal
group by CONVERT(VARCHAR(10), StartTime, 120),EventName,DatabaseName, [LogicalFileName], PhysicalFileName
--having count(1) > 5 or SUM(DurMS)/1000 > 60 -- change this for finetuning....
order by CONVERT(VARCHAR(10), StartTime, 120)
select * from #autogrowthTotal_Final
SimpleTalk.com からのオリジナルスクリプト(レポート作成に役立つように少し変更)。