TABLE OF CONTENTS
- •Recommended Settings at a Glance
- •What Autogrowth Is, and What It Isn’t
- •Are your files sized for your busiest hours?
- •What Happens During an Autogrowth Event
- •The Defaults, and Why Old Databases Have Bad Settings
- •Why Percentage Growth Is a Trap
- •Choosing Growth Sizes
- •MAXSIZE and disk space
- •Multiple files in a filegroup
- •Check Your Current Settings
- •Fix the Settings
- •How Often Are Your Databases Growing?
- •AUTO_SHRINK: Turn It Off
- •Tested-Version Notes
- •Official Behavior, Aryasoft Field Notes and Our Recommendation
- •Frequently Asked Questions
- •Sources (Microsoft Learn)
- •Stop Growth Events from Slowing Down Your Busiest Hours
Short answer
Set autogrowth to a fixed size, never a percentage: about 256 MB for small data files, 512 MB to 1 GB for mid-size ones, 1 to 4 GB for very large files with instant file initialization, and 256 MB to 1 GB for logs, never above 1,024 MB. Pre-size files for the next 6 to 12 months, set MAXSIZE, and keep autogrowth only as a safety net.
It’s the middle of the busiest hour of the day. A data file runs out of space, SQL Server starts growing it, and every session that needs to write waits. If the growth is large and the disk is slow, queries time out. If it happens in the transaction log, every write in the database waits. Nobody changed anything; an autogrowth setting chosen years ago simply went off at the worst possible moment.
This guide explains how SQL Server autogrowth works, why the old defaults and percentage growth cause trouble, how to choose sensible growth sizes for data and log files, and how to find out how often your databases are growing right now.
Recommended Settings at a Glance
| Setting | Recommendation | Source | Applies to |
|---|---|---|---|
| Growth unit | A fixed size in MB, not a percentage. | Microsoft: size gives better control than percentage | All supported versions |
| Data file under 10 GB | 256 MB | Aryasoft starting point | All; fastest with instant file initialization |
| Data file 10–100 GB | 512 MB – 1 GB | Aryasoft starting point | All |
| Data file over 100 GB | 1 – 4 GB, only with instant file initialization; otherwise smaller steps | Aryasoft starting point | All |
| Log file | 256 MB – 1 GB; never above 1,024 MB | Microsoft: do not set FILEGROWTH above 1,024 MB for logs; the range is our starting point | All |
| Log growth up to 64 MB | Benefits from instant file initialization; larger growths are zeroed | Microsoft | SQL Server 2022 and later (all editions) |
| MAXSIZE | Set it on every file, together with disk-space monitoring | Microsoft | All |
| Several files in a filegroup | Same size and same growth; consider AUTOGROW_ALL_FILES | Microsoft documents the option; the equal-size rule is our guidance | SQL Server 2016 and later |
| AUTO_SHRINK | Off on every production database | Microsoft: not recommended, off by default | All |
| model database | Set sensible file sizes and growth there | Microsoft: new databases inherit model | All |
What Autogrowth Is, and What It Isn’t
Every SQL Server data and log file has a FILEGROWTH setting: the amount SQL Server adds to the file when it runs out of space. Autogrowth keeps a database working when it fills up unexpectedly. It isn’t meant to be the way you manage database size.
Note
Microsoft’s guidance is explicit: on a managed production system, autogrow should be treated merely as a contingency for unexpected growth. Don’t manage day-to-day data and log growth with autogrow; size files in advance and grow them proactively during quiet hours.
Are your files sized for your busiest hours?
Our senior DBA team reviews file sizing, autogrowth settings, VLF layout and disk capacity so growth never surprises you at peak time.
What Happens During an Autogrowth Event
- The transaction that triggered the growth waits until the growth finishes. If the growth takes long, the query can fail with a timeout.
- Log growth blocks every writer. When the transaction log grows, every other transaction that needs to write to the log has to wait until the growth completes.
- Log files are zeroed. New log space must be filled with zeros before use, so a large log growth on slow storage can take a long time. Instant file initialization only helps data files, with one exception: from SQL Server 2022, log growths of up to 64 MB can also benefit from it.
- Data files can grow almost instantly if instant file initialization is enabled for the SQL Server service account. Without it, data file growth is zeroed too.
- Many small growths fragment the files on disk and, for the log, create too many virtual log files (VLFs), which slows startup, restores, log backups and replication. See SQL Server VLF Count.
The Defaults, and Why Old Databases Have Bad Settings
| Version | Default data file growth | Default log file growth |
|---|---|---|
| SQL Server 2016 and later | 64 MB | 64 MB |
| SQL Server 2005 – 2014 | 1 MB | 10% |
Databases created on older versions keep their settings when they’re upgraded, restored or attached to a newer server. That’s why it’s common to find a 200 GB production database still growing its data file in 1 MB steps, or its log by 10%, years after an upgrade.
Why Percentage Growth Is a Trap
Percentage growth looks adaptive, but it behaves badly at both ends:
- Small files grow in tiny steps: 10% of a 50 MB log is 5 MB, so a busy day causes hundreds of growths and thousands of VLFs.
- Large files grow in huge, unpredictable steps: 10% of a 500 GB log is 50 GB that has to be zeroed while every writer waits, and the next growth is larger still.
Critical
Never leave a large transaction log on percentage growth. A single 10% growth of a multi-hundred-gigabyte log has to be written as zeros before any transaction in that database can continue, and it can be large enough to fill the disk in one step.
Choosing Growth Sizes
There’s no single correct number; it depends on file size, how fast the database grows, storage speed and whether instant file initialization is enabled. Microsoft suggests a rule of thumb for testing of about one-eighth of the file size. In practice, we start from fixed MB values like these and adjust after watching real growth events:
| File | Starting point | Notes |
|---|---|---|
| Data file, under 10 GB | 256 MB | Fast with instant file initialization. |
| Data file, 10–100 GB | 512 MB – 1 GB | Larger steps mean fewer growth events. |
| Data file, over 100 GB | 1 – 4 GB | Only with instant file initialization; otherwise keep steps smaller. |
| Log file | 256 MB – 1 GB | Never a percentage; don’t exceed 1,024 MB. On SQL Server 2022+, 64 MB steps benefit from instant initialization. |
Tip
The best autogrowth event is the one that never happens. Size data and log files for the growth you expect over the next 6–12 months, grow them manually during a quiet window, and leave autogrowth as the safety net. Free space inside a database file costs nothing at runtime.
MAXSIZE and disk space
Microsoft also recommends setting MAXSIZE on each file, so a runaway file can’t consume the whole disk and take other databases down with it. A file that hits its MAXSIZE stops growing and writes fail, so a limit only makes sense together with monitoring. Autogrowth can’t grow past the free space on the disk either: keep watching disk space, and alert well before it runs out. See SQL Server Alerts.
Multiple files in a filegroup
SQL Server spreads new data across the files of a filegroup in proportion to their free space. If one file grows and the others don’t, new writes concentrate on the file that grew and the balance is lost. Give all files in a filegroup the same size and growth settings. From SQL Server 2016, a filegroup can be set to AUTOGROW_ALL_FILES so that all its files grow together; this is the default for tempdb, while user filegroups default to AUTOGROW_SINGLE_FILE.
Check Your Current Settings
This query lists every data and log file on the instance with its size, growth setting and maximum size, and flags the settings that need attention:
SELECT DB_NAME(mf.database_id) AS database_name,
mf.name AS logical_name,
mf.type_desc,
CAST(mf.size AS bigint) * 8 / 1024 AS size_mb,
CASE WHEN mf.is_percent_growth = 1
THEN CAST(mf.growth AS varchar(10)) + ' %'
ELSE CAST(CAST(mf.growth AS bigint) * 8 / 1024 AS varchar(10)) + ' MB' END AS growth,
CASE WHEN mf.max_size = -1 THEN 'UNLIMITED'
ELSE CAST(CAST(mf.max_size AS bigint) * 8 / 1024 AS varchar(20)) + ' MB' END AS max_size,
CASE WHEN mf.growth = 0 THEN 'Autogrowth OFF'
WHEN mf.is_percent_growth = 1 THEN 'Percent growth'
WHEN CAST(mf.growth AS bigint) * 8 / 1024 < 64 THEN 'Growth below 64 MB'
ELSE '' END AS attention
FROM sys.master_files AS mf
ORDER BY attention DESC, database_name, mf.type;
Fix the Settings
FILEGROWTH can be changed online, with no downtime. This script generates the ALTER DATABASE statements for files that use percentage growth or a step below 64 MB; review the generated values before running them:
SELECT N'ALTER DATABASE ' + QUOTENAME(DB_NAME(mf.database_id))
+ N' MODIFY FILE (NAME = N''' + mf.name + N''', FILEGROWTH = '
+ CASE WHEN mf.type = 1 THEN N'512MB' -- log
WHEN CAST(mf.size AS bigint) * 8 / 1024 < 10240 THEN N'256MB' -- data under 10 GB
WHEN CAST(mf.size AS bigint) * 8 / 1024 < 102400 THEN N'1024MB' -- data 10-100 GB
ELSE N'2048MB' END -- data over 100 GB
+ N');' AS to_execute
FROM sys.master_files AS mf
JOIN sys.databases AS d ON d.database_id = mf.database_id
WHERE d.state_desc = N'ONLINE' AND d.is_read_only = 0
AND mf.type IN (0, 1)
AND mf.growth <> 0
AND (mf.is_percent_growth = 1 OR CAST(mf.growth AS bigint) * 8 / 1024 < 64)
ORDER BY DB_NAME(mf.database_id), mf.type;
Don’t forget the model database: new databases inherit its settings, so fixing model prevents the problem from coming back. If a log has already grown in thousands of small steps, changing FILEGROWTH alone won’t remove the existing VLFs; follow the steps in our VLF guide.
How Often Are Your Databases Growing?
The default trace records every autogrowth event, including how long it took. This query reads it:
DECLARE @path nvarchar(260) =
(SELECT REVERSE(SUBSTRING(REVERSE(path), CHARINDEX(N'\', REVERSE(path)), 260)) + N'log.trc'
FROM sys.traces WHERE is_default = 1);
SELECT t.DatabaseName,
t.FileName,
CASE t.EventClass WHEN 92 THEN 'Data' WHEN 93 THEN 'Log' END AS file_type,
t.StartTime,
t.Duration / 1000 AS duration_ms,
CAST(t.IntegerData AS bigint) * 8 / 1024 AS growth_mb
FROM sys.fn_trace_gettable(@path, DEFAULT) AS t
WHERE t.EventClass IN (92, 93) -- Data File Auto Grow, Log File Auto Grow
ORDER BY t.StartTime DESC;
Many growths per day, growths during business hours, or growths that take seconds instead of milliseconds are all signs that the file is undersized or the growth step is wrong. The default trace keeps only a limited history, so check it regularly or capture the same events with Extended Events.
AUTO_SHRINK: Turn It Off
Warning
Combining autogrowth with AUTO_SHRINK creates an endless grow-shrink cycle: the file shrinks in the background, the next workload grows it again, and each round adds fragmentation and waiting. Keep AUTO_SHRINK off on every production database.
Check with SELECT name FROM sys.databases WHERE is_auto_shrink_on = 1;. For when and how a one-off shrink is appropriate, see SQL Server Shrink Best Practices.
Tested-Version Notes
Last verified: 19 October 2026. Claims below were read on Microsoft Learn on this date. T-SQL tested on SQL Server 2025 (build 17.0.4055.5).
| Item | Applies to | Note |
|---|---|---|
| Default FILEGROWTH | SQL Server 2016 and later: data 64 MB, log 64 MB. SQL Server 2005–2014: data 1 MB, log 10%. | Databases keep their settings when restored, attached or upgraded. |
| Instant file initialization for log growth | SQL Server 2022 and later, all editions | Log autogrowth up to 64 MB can benefit, including with TDE. Larger log growths cannot. Data files benefit on all versions when the service has the Perform volume maintenance tasks right. |
| VLFs created per growth | SQL Server 2014 and later; changed logic in 2022 | Growth below 1/8 of the log size creates one VLF. Otherwise growth up to 64 MB creates 4 VLFs (1 VLF from SQL Server 2022), 64 MB to 1 GB creates 8, above 1 GB creates 16. |
| AUTOGROW_ALL_FILES | SQL Server 2016 and later | Default is AUTOGROW_SINGLE_FILE for user filegroups; tempdb has the all-files behavior by default. |
| Rule of thumb for testing | All versions | Microsoft suggests about one-eighth of the file size as a testing point, not a fixed value. |
| Long autogrow symptoms | All versions | Messages 5144 and 5145 report slow autogrow; long waits can appear on allocation-page latches, with wait type PREEMPTIVE_OS_WRITEFILEGATHER. |
Official Behavior, Aryasoft Field Notes and Our Recommendation
| Topic | Official behavior (Microsoft) | Aryasoft field note | Our recommendation |
|---|---|---|---|
| Role of autogrow | On a managed production system it is merely a contingency for unexpected growth; do not manage day-to-day growth with it. | No Aryasoft measurement is published in this article. | Pre-size for 6–12 months, grow manually in a quiet window and keep autogrowth as the safety net. |
| Growth size | The increment must be large enough to avoid the penalties; the right value depends on your environment. One-eighth of the file size is a testing rule of thumb. | It is common to find databases created on older versions still growing in 1 MB steps or 10% years after an upgrade. We publish no counts. | Start from the fixed MB values in the table above and adjust after watching real growth events. |
| Log growth | New log space is zeroed except growths up to 64 MB on SQL Server 2022 and later; growth holds locks or latches while it runs. Do not exceed 1,024 MB. | A single 10% growth of a multi-hundred-gigabyte log can fill the disk and stall every writer. This is an illustration, not a measured incident. | Never leave a large log on percentage growth. |
| MAXSIZE | Turn it on for each file so no file uses all disk space. | A file that reaches MAXSIZE stops growing and writes fail, so a limit only makes sense with monitoring. | Set MAXSIZE and alert well before the disk or the limit is reached. |
| AUTO_SHRINK | Off by default and not recommended; combining it with autogrow creates unnecessary overhead. | Autogrow plus AUTO_SHRINK produces an endless grow-shrink cycle with fragmentation and waits. | Keep AUTO_SHRINK off on every production database. |
Frequently Asked Questions
Related Reading
- SQL Server VLF Count: Why Too Many VLFs Hurt and How to Fix Them
- SQL Server Transaction Log Too Big? Causes, Diagnosis and Safe Fixes
- SQL Server Shrink Best Practices: When to Shrink and When Not To
- Improve SQL Server Performance by Enabling Instant File Initialization
- SQL Server Alerts: Which Ones to Enable and How to Set Them Up Right
- SQL Server Production Outage: A Calm Runbook for the First 30 Minutes
- DBA Managed Services
- SQL Server Health Check: What It Should Cover (12-Area Checklist)
Sources (Microsoft Learn)
Technical claims in this guide were checked against these primary sources on 19 October 2026. Microsoft can change documentation at any time, so re-check version-specific details before a production change.
- Considerations for the autogrow and autoshrink settings in SQL Server
- ALTER DATABASE (Transact-SQL) file and filegroup options
- Database instant file initialization
- Manage the size of the transaction log file
- SQL Server transaction log architecture and management guide (VLFs)
- model database
SQL Server Health Check
Stop Growth Events from Slowing Down Your Busiest Hours
Aryasoft’s senior DBA team reviews file sizing, autogrowth, VLF layout and disk capacity across your SQL Server environment, and sets them up so growth never surprises you at peak time.