The Difference Between One Large RDS Instance and Several Smaller Instances
Published 2026-08-13 · Updated 2026-08-13 · Last Verified 2026-08-13
Answer
Which is correct cannot be decided from the configuration alone. Since an RDS writer cannot be horizontally split, "several smaller instances" is not a way to automatically distribute write load — it means splitting the database or workload itself. The decision rests on four measurements: the percentile of CPU utilization, how well memory and the buffer pool are keeping up, whether IOPS and throughput are hitting the instance-side ceiling, and whether the workload can actually be separated. Decide the configuration only after measuring these four.
Applicability of This Document
| Product | Amazon RDS (SQL Server / MySQL / PostgreSQL), Amazon Aurora |
|---|---|
| Verified Versions | AWS CLI v2 / the public APIs of Amazon RDS and Amazon CloudWatch (based on the specification as of 2026-08-13) |
| Environment | AWS (Amazon RDS, Amazon Aurora) |
| Required Permissions | Read commands require `rds:DescribeDBInstances` and `cloudwatch:GetMetricStatistics`. The change command requires `rds:ModifyDBInstance` |
| Execution Impact | No impact from read commands. Changing the instance class involves a restart and, on Multi-AZ, a failover |
| Restart | Required when changing the instance class (a failover occurs on a Multi-AZ configuration) |
| Last Verified | 2026-08-13 |
Ready-to-Run Commands
- 対象
- Amazon RDS (AWS CLI v2)
- 権限
- rds:DescribeDBInstances
- 変更作業
- None (read-only)
- Production実行
- Possible
# 対象: Amazon RDS(AWS CLI v2)
# 権限: rds:DescribeDBInstances
# 変更作業: なし(参照のみ)
# Production 実行: 可能
aws rds describe-db-instances \
--query "DBInstances[].{Id:DBInstanceIdentifier,Class:DBInstanceClass,Engine:Engine,\
MultiAZ:MultiAZ,Storage:AllocatedStorage,StorageType:StorageType,Iops:Iops,\
StorageThroughput:StorageThroughput,License:LicenseModel,ReadReplicas:ReadReplicaDBInstanceIdentifiers}" \
--output table`Iops` and `StorageThroughput` are provisioned values, not actual observed values. Get the actual values with the CloudWatch command below. If `ReadReplicas` is non-empty, reads are already distributed.
- 対象
- Amazon CloudWatch (namespace AWS/RDS)
- 権限
- cloudwatch:GetMetricStatistics
- 変更作業
- None (read-only)
- Production実行
- Possible
# 対象: Amazon CloudWatch(名前空間 AWS/RDS)
# 権限: cloudwatch:GetMetricStatistics
# 変更作業: なし(参照のみ)
# Production 実行: 可能
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name CPUUtilization \
--dimensions Name=DBInstanceIdentifier,Value=db-sample-instance \
--start-time 2026-08-06T00:00:00Z \
--end-time 2026-08-13T00:00:00Z \
--period 300 \
--statistics Average Maximum \
--extended-statistics p95 p99 \
--output tableJudging sizing from the average alone misreads a configuration that saturates at peak as "having headroom." A `--period 300` (5-minute) average smooths out the spike within that window, so always check `p95`/`p99` together with `Maximum`. Re-pull with a time range that includes the busy period.
- 対象
- Amazon CloudWatch (namespace AWS/RDS)
- 権限
- cloudwatch:GetMetricStatistics
- 変更作業
- None (read-only)
- Production実行
- Possible
# 対象: Amazon CloudWatch(名前空間 AWS/RDS)
# 権限: cloudwatch:GetMetricStatistics
# 変更作業: なし(参照のみ)
# Production 実行: 可能
for M in ReadIOPS WriteIOPS ReadThroughput WriteThroughput FreeableMemory DatabaseConnections
do
echo "===== $M ====="
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name "$M" \
--dimensions Name=DBInstanceIdentifier,Value=db-sample-instance \
--start-time 2026-08-06T00:00:00Z \
--end-time 2026-08-13T00:00:00Z \
--period 300 \
--statistics Average Maximum \
--output text
doneIf the sum of ReadIOPS and WriteIOPS is pegged at the provisioned IOPS, adding CPU won't improve throughput. The same applies if the sum of ReadThroughput and WriteThroughput (bytes/sec) is pegged at the instance class's EBS bandwidth ceiling. Since the ceiling differs by instance class, check the current AWS documentation for the target class's value.
- 対象
- Amazon RDS (AWS CLI v2)
- 権限
- rds:ModifyDBInstance
- 変更作業
- Yes (instance class change → restart / failover on Multi-AZ)
- Production実行
- Possible, but decide the maintenance window and rollback procedure first
# 対象: Amazon RDS(AWS CLI v2)
# 権限: rds:ModifyDBInstance
# 変更作業: あり(インスタンスクラス変更 → 再起動 / Multi-AZ ではフェイルオーバー)
# Production 実行: 可能だが接続断が発生する。メンテナンス枠内で実施すること
aws rds modify-db-instance \
--db-instance-identifier db-sample-instance \
--db-instance-class db.r6i.4xlarge \
--no-apply-immediatelyAdding `--no-apply-immediately` applies the change at the next maintenance window. `--apply-immediately` triggers an immediate restart, so use it only during a window where a connection drop is acceptable. Before changing, confirm with `aws rds describe-orderable-db-instance-options` that the target class is selectable for your engine, version, and region.
How to Read the Results
| Column | Meaning | What to Check |
|---|---|---|
| CPUUtilization (p95 / p99 / Maximum) | vCPU utilization | Consistently high p95 means CPU-bound. A low average but a high Maximum alone likely points to a specific batch job |
| FreeableMemory | Freeable memory amount (bytes) | A persistently small value means memory-bound. The buffer pool may not be able to hold the working set |
| ReadIOPS / WriteIOPS | Read/write I/O operations per second | Whether the sum is pegged at the provisioned IOPS — if so, adding CPU will not help |
| ReadThroughput / WriteThroughput | Read/write bytes per second | Whether the sum is close to the instance class's EBS bandwidth ceiling — check the ceiling in the current AWS documentation |
| DatabaseConnections | Number of connections | If near the limit, the cause is often connection pool design rather than sizing |
| DBInstanceClass | The current instance class | When using a license-included model for SQL Server, compare the total cost on the premise that the license fee is tied to vCPU count |
| MultiAZ | Whether a standby exists | If true, a class change becomes a cutover operation that involves a failover |
When to Use This
- CPU utilization stays high at peak, and it is unclear whether to add capacity or consolidate
- Proposals such as "3 × 8xlarge" vs. "2 × 12xlarge" are on the table with no agreed basis for comparison
- Increasing the instance size didn't speed things up as much as expected
- Consolidating onto one instance means a single failure now stops the entire system at once
- Increasing the instance size on SQL Server RDS raised the total cost more than expected
Possible Causes (Most Likely First)
01
The premise that a writer cannot be horizontally split is not shared
RDS read replicas can only scale out read processing. RDS has no mechanism that automatically distributes a single write workload across multiple instances. So choosing "several smaller instances" always comes with a design decision to split the workload by database or by function.
02
The bottleneck is not CPU
If something other than CPU — an IOPS ceiling, an EBS throughput ceiling, lock contention, a single-threaded batch job — is the limiting factor, raising the instance class just leaves vCPUs idle. Deciding size without measuring what the limiting factor actually is leads to this situation.
03
Resources that scale with instance size are mixed with ones that do not
vCPU, memory, network bandwidth, and EBS bandwidth broadly increase with instance size, but not at the same rate. Provisioned IOPS on storage is also set independently of the instance class and does not increase just by raising the class.
04
The license billing model has not been factored in
Under SQL Server's license-included model, the license fee is tied to vCPU count. Even with the same total vCPU count, a different number-of-instances configuration can change the minimum configuration or redundancy approach per instance, so the total cost comparison is not a simple sum. Always calculate the amount with the AWS Pricing Calculator and your own contract terms.
05
Blast radius hasn't been treated as a design dimension
The more you consolidate onto one instance, the wider the impact of that single instance's failure, maintenance, or a parameter-change mistake. Conversely, adding instances narrows the impact radius while increasing the sheer number of opportunities for a failure. When availability requirements differ by business function, the axis for a split decision is blast radius, not cost.
Diagnostic Steps
- 1
List the current configuration
Read-onlyUse `aws rds describe-db-instances` to check the class, storage type, provisioned IOPS, Multi-AZ status, and the presence of read replicas.
- 2
Measure CPU as percentiles
Read-onlyPull CPUUtilization's p95, p99, and Maximum over a period that includes the busy season. The average alone is not enough to judge.
- 3
Measure memory sufficiency
Read-onlyLook at the trend of FreeableMemory together with the engine's buffer cache hit ratio. If the hit ratio is low and FreeableMemory is also small, memory is the limiting factor.
- 4
Check whether I/O is hitting a ceiling
Read-onlyCompare ReadIOPS+WriteIOPS against the provisioned IOPS, and ReadThroughput+WriteThroughput against the EBS bandwidth ceiling of the instance class. Refer to current AWS documentation for the ceiling values.
- 5
Inventory whether the workload can be separated
Read-onlyIdentify cross-database queries, shared master tables, and any distributed transactions. The more cross-cutting processing there is, the higher the cost of splitting.
- 6
Test candidate configurations
LowRun a production-equivalent workload against a test instance restored from a snapshot, and measure how the metrics change on candidate classes. Avoid trial and error in production.
Solutions
Low-risk action that can be done immediately
Identify a single limiting factor
Read-onlyNarrow it down to one of CPU, memory, IOPS, throughput, or locking through measurement. No conclusion can be reached by comparing configuration options until this is settled.
Consider offloading read load to a read replica
LowIf reporting or read-heavy load is large, moving it to a read replica can have less impact than growing the writer. This only applies to processing that can tolerate replica lag.
Change requiring advance review
Review the storage-side ceiling first
MediumIf I/O is the limiting factor, reviewing the storage type, provisioned IOPS, and storage throughput comes before the instance class. This can have less impact than changing the instance class.
Build a plan to split by workload
MediumIf you choose to split, design the split unit (by business system or by schema), how to replace cross-cutting processing, the cutover procedure, and the rollback procedure together.
Estimate the increase in operational work
Read-onlyAdding instances multiplies the backup window, maintenance window, parameter group, monitoring setup, alerts, and patching — all by the instance count. Include this effort in the configuration comparison.
Change involving a restart or service impact
Change the instance class
HighA class change involves a restart, and a Multi-AZ configuration triggers a failover. Since the cutover time varies by workload and engine, measure it in a test environment first and then decide on the maintenance window.
Separate a database onto its own instance
Expert Review RequiredMoving a DB to a separate instance turns joins that previously completed within the same instance into Linked Server or application-side joins. Since performance characteristics and transaction boundaries change, inventorying the queries to migrate is mandatory.
!Warnings
- This article does not give a conclusion on "which is better," nor any price or savings percentage. Judge cost with the AWS Pricing Calculator and your own contract terms, and performance with your own CloudWatch measurements.
- A read replica is a mechanism for scaling reads — it does not increase write throughput. If writes are the limiting factor, adding instances does not solve it.
- Changing the instance class involves a restart. A Multi-AZ configuration triggers a failover, and its duration varies by environment. Do not assume a figure — measure it in a test environment before building the cutover plan.
- Splitting a database turns a join within the same instance into a Linked Server or application-side join. This adds a network round trip, changing the execution plan and performance characteristics, and may require a distributed transaction.
- As the instance count grows, backups, maintenance windows, parameter groups, and monitoring setup all multiply by that count. Include this operational effort in the configuration comparison.
- CloudWatch's standard-resolution metrics average over the period. A short spike gets smoothed out, so use `Maximum` together with extended statistics (p95, p99).
Differences by Version and Environment
If This Doesn't Resolve It
Check wait events inside the engine
If things are slow without CPU or I/O hitting a ceiling, lock waits, latch waits, or network waits may dominate. This isn't an instance-size problem.
Check whether a single query is limited to a single thread
If a huge batch job isn't parallelized, adding vCPUs won't shrink its runtime. Check the query-side parallelism setting first.
Check the connection pool configuration
If DatabaseConnections is near its limit, the cause may be the application-side pool configuration rather than instance size.
Cross-check storage's provisioned value against the measured value
If the measured value is always well below the provisioned IOPS, storage is not the limiting factor. If it's pegged, changing the class won't help.
Identify cross-cutting processing that will be needed after splitting
Check whether nightly batch jobs or aggregation processing span multiple databases, based on running queries and job definitions.
Basis and Limitations of This Document
Explanation based on official product documentation
A general decision procedure based on the public specifications of Amazon RDS instance classes, Multi-AZ, and read replicas, and the public specifications of Amazon CloudWatch's AWS/RDS namespace metrics (CPUUtilization, ReadIOPS, WriteIOPS, ReadThroughput, WriteThroughput, FreeableMemory, DatabaseConnections). It does not include per-instance-class ceiling values, pricing, or any specific environment's measurements.
FAQ
Which is better, 3 × 8xlarge or 2 × 12xlarge?
It cannot be decided from the configuration alone. Even with the same total vCPU count, the conclusion flips depending on whether the write workload can be separated. If it cannot, a larger instance is favorable because the per-instance ceiling matters; if it can be cleanly separated by business function, several instances have the advantage of a narrower blast radius. First measure CPU p95, FreeableMemory, and how close IOPS and throughput are to their ceilings.
Does adding more RDS instances improve write performance?
No. RDS has a single writer, and read replicas only distribute reads. To distribute writes, you need to split the database or workload itself as an application design decision.
For SQL Server, what happens to the license cost if you split into more instances?
The cost of the license-included model is tied to vCPU count. It looks like a simple comparison is possible when the total vCPU count is the same, but in practice the minimum configuration and redundancy approach per instance change the total. Calculate the amount with the AWS Pricing Calculator and your own contract terms — this article does not give pricing.
Does raising the instance class always make things faster?
No. If the limiting factor is storage's provisioned IOPS or lock contention, adding vCPU and memory will not help. Before changing the class, pin down which single factor among CPU, memory, IOPS, throughput, or a wait event is hitting its ceiling.
Can this be run in production?
`describe-db-instances` and `get-metric-statistics` are read-only and can be run as-is in production. A class change via `modify-db-instance` involves a restart and failover, so decide the maintenance window and rollback procedure before carrying it out.
What happens to cross-database queries after splitting?
On SQL Server, they get replaced by a Linked Server or an application-side join. Either way, a network round trip is added and the execution plan changes, so identify "cross-cutting processing" before splitting and verify the post-replacement performance in a test environment.
Questions This Document Covers
- What determines throughput on RDS SQL Server
- Which is better, 3 × 8xlarge or 2 × 12xlarge
- Does adding RDS instances also speed up writes
- Should the database be split or consolidated onto one instance
What the Risk Labels Mean
- Read-onlyDoes not change data or settings.
- LowImpact is limited, but permissions and load should be checked.
- MediumMay affect performance, locking, or cost.
- HighMay cause an outage, data loss, or require recovery work.
- Expert Review RequiredRequires a separate review before applying to production.
GIIP's Scope of Support
The sizing decision itself is a one-time task once you have the measurements. What is hard is everything after that. The workload changes as the business grows, and a configuration that was right six months ago is not guaranteed to still be right today. At GIIP, an AI agent continuously collects CPU, memory, and I/O metrics for several databases on AWS and Azure and roughly 30 web services, and a human specialist judges whether a configuration review is needed once a trend approaches a ceiling. This treats sizing not as a one-off consultation but as ongoing work that starts from trend monitoring.
Author & Technical Review
GIIP Production Operations Team
About 30 years of experience in designing, migrating, and operating large-scale web services, SQL Server, Oracle, AWS, and Azure. Experience includes 12 sets of x12large-class AWS RDS for SQL Server environments, an Oracle environment with roughly 120,000 tables, and migrating roughly 3TB from TiDB to Aurora MySQL. AI agents and human experts currently continue to monitor and operate multiple cloud databases and about 30 web services.
What to Check When Reviewing AWS Database Costs
A checklist for reviewing AWS database spend in order of increasing impact: stop what is unused → right-size → storage → backups → non-production → commitments.
infrastructureWhat's the Difference Between EBS IOPS and Physical Disk IOPS
A document organizing why EBS IOPS cannot be compared directly to physical disk IOPS, based on where the ceiling applies (volume vs. instance) and how to measure it.
infrastructureRandom IOPS vs. Sequential IOPS, and How to Read Benchmark Results
A document organizing why an IOPS figure cannot be compared without I/O size, queue depth, and read/write ratio, and how to build measurement conditions with fio.
sql-serverCauses and Checks for Msg 7356 on a Linked Server in SQL Server
Msg 7356 signals that column metadata disagreed between compile time and run time. This organizes how to isolate the cause and how to work around it using pass-through queries.
Related Services
Get a consultation on your RDS instance configuration
If you need to repeat the same checks across multiple environments, we can discuss your entire operations setup.
Get a consultation on your RDS instance configuration