Why you should NOT multiply SQL Server instances

Consolidating SQL Server instances is better than installing several of them on the same server.

Why do people install several instances on one server?

In a world of virtualisation and containers, a system administrator’s natural reflex is to isolate: one application, one service, one instance.

For database administrators, the reasons tend to be:

  • managing security separately per database;
  • isolating performance between applications;
  • allowing applications to fail over independently;
  • running several SQL Server versions side by side on the same server.

None of these actually requires separate instances.

I go into more detail below, but the short answers are:

  • Managing security separately per database ⮕ each database has its own set of permissions. No separate instance needed.
  • Isolating performance between applications ⮕ use the Resource Governor to allocate specific resources to groups of users or workloads.
  • Allowing applications to fail over independently ⮕ use availability groups to manage failover at database level.
  • Running several SQL Server versions side by side ⮕ use the database compatibility level to handle the behavioural differences between versions.

Why it is not a good idea

Installing several instances on the same physical or virtual machine is an anti-pattern that degrades overall performance.

SQL Server is natively designed for consolidation. Here is how it manages its resources.

SQLOS: an operating system inside the operating system

SQL Server does not just ask Windows for resources like an ordinary piece of software. It has its own abstraction layer, SQLOS, which handles:

  • Scheduling: SQL Server manages its own threads, in user mode (User Mode Scheduling).
  • Memory: it has its own page manager to optimize the cache.
  • I/O: it arbitrates its own read and write priorities.

The colocation problem

When you install two instances on one machine, you install two mini operating systems that are unaware of each other. Each SQLOS tries to grab as many resources as it can:

  • Memory war: by default, each instance tries to consume all the available RAM. Without strict manual configuration of Max Server Memory, the server ends up swapping to disk.
  • CPU contention: the schedulers of the two instances fight over the same physical cores, causing excessive context switching at the Windows processor level.

Unlike some other database engines, SQL Server is designed to host many databases inside a single instance. It is natively multi-tenant.

Granular resource management

Rather than creating several instances to separate projects, it is far more effective to use one instance and manage resources inside it:

  • Isolated security: each database has its own permissions. A user of database A has no privilege on database B, even though they share an instance.
  • Resource Governor (Enterprise edition, and Standard as well since SQL Server 2025): this lets you cap or guarantee resources — CPU, RAM, IOPS — for specific groups of users within the instance.

Availability groups

One argument frequently made for multiplying instances is the need for independent failover. People wrongly assume you need one instance per application so that they can fail over separately.

But availability groups exist. With AGs, the unit of failover is no longer the instance but the group of databases.

  • You can have a single SQL Server instance.
  • Inside it, you create several availability groups: AG1, AG2, AG3.
  • AG1 can be active on node A while AG2 is active on node B.

Why consolidate? The concrete benefits

Buffer pool optimization

A single instance manages one global cache. If one database is very active in the morning and another in the afternoon, SQL Server reallocates the internal memory dynamically, with no human intervention. With two instances the memory is static, and wasted on the instance that is not using it.

Simpler maintenance

  • Patching: one cumulative update per server.
  • Monitoring: one set of alerts and performance counters to watch.
  • Licensing: consolidating often reduces the number of cores needed to sustain the same performance, which can reduce the bill.

Less context switching

Letting a single SQLOS manage every thread on the machine means Windows does less work. The processor spends more time running your SQL queries and less time refereeing disputes between two greedy instances.

The SQL Server version problem

A classic argument for several instances: my application is certified for SQL Server 2016, I cannot install it on a SQL Server 2022 instance.

This confuses the engine version, the binaries, with the compatibility level, the logic.

SQL Server is designed to run databases with behaviour inherited from every version back to SQL Server 2008. Microsoft guarantees application compatibility not at the instance version, but at the database compatibility level.

Microsoft guarantees that a database set to a given compatibility level — level 130 for SQL Server 2016, say — behaves the same way whether it is hosted on a 2016, 2019 or 2022 instance.

Stop confusing the engine with the behaviour

Think of the SQL Server engine, the instance, as the processor in your computer. Each version is faster, more secure and more modern. The database compatibility level is the set of rules you impose on that engine for one specific database.

  • The instance, the engine: manages files, memory, parallelism and global security. The more recent it is, the better it performs.
  • The compatibility level, the logic: defines how T-SQL is interpreted and how the query optimizer behaves.

Why the compatibility level beats multiple instances

Installing an old instance — SQL Server 2014, say — on a modern server carries serious risks:

  1. Security holes: old instances no longer receive critical security updates.
  2. OS incompatibility: running SQL Server 2014 on Windows Server 2022 is not supported and can crash SQLOS.
  3. Throttled performance: an old engine cannot make effective use of modern processors or NVMe drives.

The right approach: install a single instance on the most recent version, SQL Server 2022. Attach your databases to it and set their compatibility level to their original version.