带有重载数据库的 MS SQL Server 自动增长配置

Sae*_*mad 4 sql-server auto-growth

我有一个大小约为 200G 的数据库,并且每天都会发生许多插入操作(每天增长大约 3 到 4 GB),但自动增长设置设置为 1 MB。

我认为这是一个问题,我认为如果我将其设置为 1GB 会提高性能和能力,对吗?

我认为 1MB 自动增长数据库将总是忙于分配新空间,是吗?关于提高性能的最佳实用方法有什么建议吗?

谢谢大家

Kin*_*hah 9

1 MB 不是自动增长的正确选择!

您应该始终将自动增长设置为适合您环境的合理值。我倾向于获取一个月的 autgrowth 值,然后将其取平均值,为我的数据库提供一个自增长的棒球场数字。

我也在这里提供了一个示例脚本。另请参阅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
Run Code Online (Sandbox Code Playgroud)

来自SimpleTalk.com 的原始脚本(稍作修改以帮助我进行报告)。