Azure SQL Managed Instance Next-Gen: Real IOPS Control at Last

Azure SQL Managed Instance Next-Gen General Purpose: Real IOPS Control at Last – SQLYARD

Azure SQL Managed Instance Next-Gen General Purpose: Real IOPS Control at Last


Introduction

Azure SQL Managed Instance has always been positioned as the lift-and-shift friendly PaaS option for SQL Server. You get high compatibility, automatic patching, built-in HA, and reduced operational overhead. For many workloads it is the easiest way to modernize without rewriting applications.

But for years, one thing held it back: storage performance. If you needed more I/O, you had to scale the entire instance. More vCores, more memory, more cost — even when CPU was not the bottleneck. Disk latency issues meant bigger SKUs, longer scale times, and higher bills.

The Next-Gen General Purpose tier, now generally available, fixes that. This is not a minor enhancement. It is a fundamental architectural shift in how storage works in Azure SQL Managed Instance.

What Actually Changed: Elastic SAN

The biggest change is invisible at first glance. Microsoft replaced the legacy page blob-based storage backend with Azure Elastic SAN.

Your data and log files no longer run on the old page blob architecture. Instead they live on a shared, high-performance SAN designed for consistent low latency and scalable throughput. Elastic SAN was built specifically to decouple storage performance from compute — and that design decision is what makes everything else possible.

Old Architecture

Data and log files stored on Azure Premium page blobs. I/O performance tied to file size and blob throughput limits. Transaction log write throughput capped at 4.5 MB/s per vCore, max 120 MB/s per instance.

Next-Gen Architecture

Data and log files stored on Azure Elastic SAN. I/O performance decoupled from compute. Performance quotas shared across the whole instance — no need to resize individual files.

Higher Limits

Storage up to 32 TB (up from 16 TB). Up to 500 databases per instance (up from 100). Up to 128 vCores. Up to 4,096 files per database.

Billing Stays the Same

Your billing statement still shows General Purpose tier. Any Reserved Instance pricing you purchased for General Purpose automatically applies to Next-Gen GP. No repricing or contract changes.

The Three New Sliders: IOPS, Memory, and Storage

Next-Gen General Purpose introduced independent control over three dimensions that were previously locked together. You can now adjust any of them online without touching the others:

SliderWhat It DoesDowntime?Available Before?
IOPS Provision additional IOPS beyond the free baseline No — online in-place No — new in Next-Gen
Memory Up to 49 memory configurations per instance, independent of vCores No — online in-place No — new in Next-Gen
Storage Resize storage independently of compute Typically no — within ~5 minutes Partial — limited flexibility before

The memory slider is often overlooked in Next-Gen coverage but is equally significant. It enables up to 49 memory configurations per instance — letting you right-size memory independently of vCores. You are billed only for the additional memory beyond the default allocation. This alone can save significant cost by letting you choose exactly the memory-to-compute ratio your workload needs.

How the IOPS Model Works

Microsoft implemented a transparent, predictable IOPS model:

  • Every instance receives 3 IOPS per GB of reserved storage for free
  • Minimum free baseline is 300 IOPS per server regardless of storage size
  • A 1 TB (1,024 GB) instance gets 3,072 free IOPS included in the storage price
  • Additional IOPS cost: 1 IOPS = regional storage price per GB ÷ 3
  • All changes are applied online — typically within 5 minutes — with no instance restart

Real-World IOPS Cost Example

Region Storage PriceCost per Additional IOPS1,000 Extra IOPS/Month
$0.115 per GB (East US example)$0.038 per IOPS~$38/month

Compare that to a single vCore upgrade on a 16-vCore instance — which costs hundreds of dollars per month and adds unwanted compute capacity. Adding IOPS directly is dramatically cheaper and more targeted for pure storage bottlenecks.

IOPS by vCore Count

vCoresFree IOPS (1 TB storage)Max Provisionable IOPS
4 vCores3,0726,400
8 vCores3,07212,800
16 vCores3,07225,600
32 vCores3,07251,200
80 vCores3,07280,000 (hard cap)

Limitations to Know Before You Upgrade

Current Limitations — Review Before Upgrading

  • IOPS are capped by vCore count — 1,600 IOPS per vCore, hard maximum of 80,000 IOPS regardless of vCore count. If you need more than 80,000 IOPS, consider Business Critical tier instead.
  • Zone redundancy is not available for Next-Gen General Purpose. If your workload requires zone-redundant HA, you must remain on standard General Purpose or upgrade to Business Critical.
  • Upgrade is one-directional — once upgraded to Next-Gen GP, downgrading back to standard GP may require additional steps. Confirm your rollback plan before upgrading production.
  • Not all regions may be available at time of reading — check the Azure portal for regional availability before planning a migration.
  • Subnet requirements — Next-Gen GP may require a different subnet configuration in some cases. Verify with your networking team before enabling on an existing instance.

Why This Matters to DBAs

This upgrade gives DBAs something rare in the cloud: operational control over storage that mirrors how you worked with on-premises SANs.

Before Next-Gen

  • I/O bottleneck detected
  • Only option: scale compute
  • Scale takes time — sometimes hours
  • Cost increases across the board
  • Paying for CPU you do not need
  • Storage files had to be individually resized for IOPS

After Next-Gen

  • I/O bottleneck detected
  • Move the IOPS slider
  • Applied online in ~5 minutes
  • Only pay for the IOPS added
  • vCores and memory unchanged
  • Performance quotas shared across the whole instance

This is the closest Managed Instance has ever felt to running real infrastructure — with the ability to tune, measure, and adjust storage — without the operational burden of managing that infrastructure yourself.

Hands-On Workshop: Measuring and Tuning IOPS

This workshop lets you establish a baseline, identify I/O bottlenecks, tune IOPS, and validate the improvement — all without downtime.

1

Baseline Your I/O — Run Before Changing Anything

Capture wait stats and file latency before making any changes. These numbers are your benchmark.

Top I/O Wait Types

-- Identify I/O-related waits
SELECT
    wait_type,
    wait_time_ms,
    waiting_tasks_count,
    wait_time_ms / NULLIF(waiting_tasks_count, 0) AS avg_wait_ms
FROM sys.dm_os_wait_stats
WHERE wait_type LIKE 'PAGEIOLATCH%'
   OR wait_type = 'WRITELOG'
   OR wait_type = 'IO_COMPLETION'
ORDER BY wait_time_ms DESC;

File-Level Latency

-- Read and write latency per database file
SELECT
    DB_NAME(vfs.database_id)                              AS database_name,
    mf.name                                               AS file_name,
    mf.type_desc,
    vfs.num_of_reads,
    vfs.io_stall_read_ms  / NULLIF(vfs.num_of_reads,  0) AS avg_read_ms,
    vfs.num_of_writes,
    vfs.io_stall_write_ms / NULLIF(vfs.num_of_writes, 0) AS avg_write_ms,
    vfs.io_stall_read_ms + vfs.io_stall_write_ms         AS total_io_stall_ms
FROM sys.dm_io_virtual_file_stats(NULL, NULL) vfs
JOIN sys.master_files mf
    ON vfs.database_id = mf.database_id
    AND vfs.file_id    = mf.file_id
ORDER BY total_io_stall_ms DESC;

Record your baseline numbers. Typical healthy targets: average read latency under 5ms, write latency under 2ms for the transaction log.

2

Enable Next-Gen and Increase IOPS in the Portal

If not already on Next-Gen, enable it first. Both steps are done in the Azure portal with no downtime:

  1. Open your Managed Instance in the Azure portal
  2. Go to Compute + Storage
  3. Select Enable Next-Gen General Purpose (if not already enabled)
  4. Move the IOPS slider to your target value
  5. Review the estimated cost shown in the portal
  6. Click Apply

The change applies as an in-place upgrade, typically completing within 5 minutes. No reconnection required for most changes.

Three types of storage upgrade experiences exist depending on what you changed. Some combinations may involve a brief failover. Review the Microsoft documentation for the specific experience your change will trigger before applying in production.

3

Measure Again and Compare

Run the same queries from Step 1 and compare the results:

-- Re-run after IOPS increase — compare to baseline
SELECT
    DB_NAME(vfs.database_id)                              AS database_name,
    mf.name                                               AS file_name,
    mf.type_desc,
    vfs.num_of_reads,
    vfs.io_stall_read_ms  / NULLIF(vfs.num_of_reads,  0) AS avg_read_ms,
    vfs.num_of_writes,
    vfs.io_stall_write_ms / NULLIF(vfs.num_of_writes, 0) AS avg_write_ms
FROM sys.dm_io_virtual_file_stats(NULL, NULL) vfs
JOIN sys.master_files mf
    ON vfs.database_id = mf.database_id
    AND vfs.file_id    = mf.file_id
ORDER BY avg_read_ms DESC;

You should see lower average read and write latency and reduced PAGEIOLATCH and WRITELOG wait times. The improvement is typically visible immediately.

4

Find the Cost Sweet Spot

Once performance meets your SLA, gradually reduce IOPS to find the minimum that still satisfies your requirements. This is cost optimization that was simply impossible before Next-Gen.

  1. Confirm performance is acceptable at current IOPS
  2. Reduce the IOPS slider by 1,000–2,000 IOPS
  3. Monitor for 30–60 minutes under normal load
  4. Check wait stats and latency again
  5. Repeat until performance just meets your SLA threshold

This iterative tuning loop — detect, add, measure, reduce, repeat — is exactly how on-premises SAN engineers worked for years. Next-Gen brings that discipline to Azure SQL Managed Instance for the first time.

Automation: Adjust IOPS with Azure CLI and ARM

IOPS changes can be scripted via the Azure REST API — useful for load testing, scheduled scaling windows, or infrastructure-as-code deployments.

Azure CLI — Update IOPS on an Existing Instance

# Adjust IOPS on an existing Next-Gen Managed Instance
# Replace values in angle brackets with your actual resource details
az rest \
  --method patch \
  --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Sql/managedInstances/<instance-name>?api-version=2024-11-01-preview" \
  --body "{
    \"properties\": {
      \"storageIOps\": 8000
    }
  }"

ARM Template — Deploy New Instance with Next-Gen Enabled

{
  "type": "Microsoft.Sql/managedInstances",
  "apiVersion": "2024-11-01-preview",
  "name": "mi-nextgen-example",
  "location": "eastus",
  "sku": {
    "name": "GP_Gen5",
    "tier": "GeneralPurpose",
    "capacity": 8
  },
  "properties": {
    "storageSizeInGB": 1024,
    "isGeneralPurposeV2": true,
    "storageIOps": 8000
  }
}

The isGeneralPurposeV2: true flag is what enables Next-Gen General Purpose. Without it, the instance deploys on the legacy page blob architecture. The storageIOps property sets the provisioned IOPS — set it to 0 or omit it to use the free baseline only.

Summary

Azure SQL Managed Instance Next-Gen General Purpose is one of the most operationally significant upgrades Microsoft has made to the platform. The move from page blobs to Elastic SAN is not cosmetic — it unlocks a fundamentally different model for managing database performance in Azure.

What ChangedImpact
Storage backendAzure Elastic SAN — faster, more consistent, decoupled from compute
IOPS controlDirect provisioning via slider — online, no restart
Memory control49 memory configurations independent of vCores
Free baseline IOPS3 IOPS per GB, minimum 300 IOPS per server — included in storage price
Extra IOPS cost~$38/1,000 IOPS/month in East US — far cheaper than a vCore upgrade
Change timeTypically within 5 minutes — in-place upgrade
Max IOPS1,600 per vCore, hard cap at 80,000
Zone redundancyNot available in Next-Gen GP — use standard GP or Business Critical

For years, DBAs have been forced to overprovision compute to fix storage problems. Next-Gen General Purpose ends that. If you run Managed Instance today and care about performance, enabling Next-Gen is not optional — it is the new baseline.

References


Discover more from SQLYARD

Subscribe to get the latest posts sent to your email.

Leave a Reply

Discover more from SQLYARD

Subscribe now to keep reading and get access to the full archive.

Continue reading