Skip to main content
Back to the Azure Footguns Database
CostGovernanceHighOccasionalAZF-0014

An empty SQL Elastic Pool bills its full provisioned capacity with no databases in it

A SQL Elastic Pool with no databases keeps billing its provisioned eDTU/vCore capacity. The pool charges for the compute it reserves, whether or not a single database sits in it.

Footgun ID
AZF-0014 (Azure Footgun No. 14)
Azure service
Azure SQL Database
Resource type
Microsoft.Sql/servers/elasticPools
Updated
July 1, 2026

What it is

A SQL Elastic Pool that has no databases assigned to it. An elastic pool exists to share a block of provisioned compute (eDTUs or vCores) across many databases, but this one shares that capacity across nothing. It keeps billing the full provisioned rate for a workload that isn't there.

Impact (cost)
~$75–$465/month at list price depending on tier (Basic/Standard/Premium) for a pool with zero databases
Basis: Azure list price. Figures are estimates, not measurements.

Why it happens

Pools are created to consolidate a set of databases, then the databases move out. They get migrated to a managed instance, consolidated onto a single server, retired with the app they backed, or deleted at the end of a dev/test cycle. The pool, which is a separate resource with its own lifecycle, stays behind.

It survives because it looks intentional. Azure does not surface a "this pool is empty" warning, and the pool resource does not expose a database count you can eyeball. The only way to know a pool is empty is to look at every SQL database and check which pool it points back to. Nobody does that by hand, so the empty pool keeps billing its reserved compute indefinitely.

What it costs / blast radius

An empty pool bills the full provisioned tier: it starts around $75/month for a Basic pool (50 eDTU) and climbs to roughly $225/month for Standard (50 eDTU) and $465/month for Premium (125 eDTU) at list price, higher still for larger vCore configurations. (List price; reserved capacity and your contract differ.) That is $900 to $5,600+/year for reserved database compute serving zero databases. Unlike a small orphan, a single forgotten Premium pool is a meaningful line item on its own.

See it

Find them: elastic pools with no databases pointing back to them
Resources
| where type =~ 'microsoft.sql/servers/elasticpools'
| project poolId = tolower(id), name, resourceGroup, subscriptionId,
          sku = sku.name, tier = sku.tier, capacity = sku.capacity
| join kind=leftouter (
    Resources
    | where type =~ 'microsoft.sql/servers/databases'
    | where isnotempty(properties.elasticPoolId)
    | project poolRef = tolower(tostring(properties.elasticPoolId))
    | distinct poolRef
  ) on $left.poolId == $right.poolRef
| where isempty(poolRef)   // no database references this pool → it's empty
| project name, resourceGroup, subscriptionId, sku, tier, capacity
Fix: confirm no databases live in it, then delete the empty pool
// Confirm the pool is genuinely empty before removing it.
az sql elastic-pool list-dbs --resource-group rg-prod \
  --server sql-prod-01 --name pool-legacy --query "[].name"

// If the list is empty and nothing plans to move in, delete the pool.
az sql elastic-pool delete --resource-group rg-prod \
  --server sql-prod-01 --name pool-legacy

How StratoLens helps

StratoLens cross-references every SQL database against every elastic pool automatically, continuously, across all your subscriptions, and flags the pools with zero databases along with their monthly cost. The database-count question that Azure won't answer for you gets answered on every scan, so an empty Premium pool can't quietly bill $5k/year in a server nobody opens.

Start Your 28-Day Free Trial

Every feature unlocked. Deploys to your Azure tenant. No data leaves your tenant.

Available now on the Azure Marketplace.

Built for Azure infrastructure teams who need complete visibility across their entire estate.