Skip to content
Cloud Efficiency Hub

Non-Production SQL Managed Instances Running Without a Stop/Start Schedule

The short version

Azure SQL Managed Instance bills vCores and the SQL Server license every hour the instance is running, whether or not anyone is connected.

PointFive Research

Cloud cost research at PointFive

Category
Databases
Reference
CER-0435
Type
Inefficient Configuration

Explanation

Why the waste happens and who it affects.

Development, test, QA and training instances are usually needed only during working hours, yet they are commonly left running around the clock, so most of their compute and license spend accrues on nights and weekends with no activity.

For instances in the General Purpose service tier, Microsoft provides a stop and start feature specifically to save on billing costs when an instance is not in use: a stopped instance is not billed for vCores or license, only for data and backup storage. The feature includes a built-in Start/Stop Schedule, but it is opt-in, so non-production instances without a schedule keep paying for idle hours. Starting an instance takes about 20 minutes, which discourages stopping it by hand.

Billing model

The pricing dimensions that drive this cost.

SQL Managed Instance charges differ by instance state.

Running instance
VCores and SQL license are billed for every started hour, so an instance running at 12:01 is charged for the whole hour
Stopped instance
No vCore or license charges; data storage and backup storage continue to be billed
Azure Hybrid Benefit
Applied per resource; to reuse the license elsewhere while an instance is stopped, AHB must be disabled before stopping and re-enabled after starting
Reservation discount
Applied to vCore hours emitted; when a reserved instance is stopped, the discount moves to another matching instance in scope, if one exists

How to detect

4 checks to find it in your estate.

  • List managed instances in the General Purpose tier whose subscription, resource group or tags identify non-production use, and check whether a schedule exists with az sql mi start-stop-schedule show or the Start/Stop Schedule blade
  • Review avg_cpu_percent, io_requests and log_rate_mbps for those instances by hour of day and day of week to find sustained idle windows outside business hours
  • In Cost Management, compare compute and license cost for these instances against the hours they are actually used
  • Exclude instances that cannot be stopped: those in a failover group, using the Managed Instance link, with zone redundancy enabled, in an instance pool, or outside the General Purpose tier

How to fix

5 ways to remove the waste.

  • Create a Start/Stop Schedule on each eligible non-production instance (portal Start/Stop Schedule blade, az sql mi start-stop-schedule create, or New-AzSqlInstanceStartStopSchedule), setting start times about 20 minutes before the instance is needed
  • Stop instances on demand with az sql mi stop or Stop-AzSqlInstance when they will be idle for irregular periods such as between test cycles
  • Keep instances running during yearly long-term retention backup windows, because backups are skipped while an instance is stopped
  • Plan around documented limits: successive schedule actions must be at least one hour apart, configuration cannot be changed while stopped, error logs are erased on stop, and Azure may start an instance for urgent maintenance and bill compute while it is online
  • If a non-production instance cannot be stopped because it uses zone redundancy or a failover group, review whether those settings are needed outside production

Documentation

Vendor references for pricing and configuration.