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.
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
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// 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-legacyHow 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.