giip
SES Proposal
AWSHighサイジング性能コストRDSフェイルオーバー

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

ProductAmazon RDS (SQL Server / MySQL / PostgreSQL), Amazon Aurora
Verified VersionsAWS CLI v2 / the public APIs of Amazon RDS and Amazon CloudWatch (based on the specification as of 2026-08-13)
EnvironmentAWS (Amazon RDS, Amazon Aurora)
Required PermissionsRead commands require `rds:DescribeDBInstances` and `cloudwatch:GetMetricStatistics`. The change command requires `rds:ModifyDBInstance`
Execution ImpactNo impact from read commands. Changing the instance class involves a restart and, on Multi-AZ, a failover
RestartRequired when changing the instance class (a failover occurs on a Multi-AZ configuration)
Last Verified2026-08-13

Ready-to-Run Commands

List the current instance class and storage configurationRead-only
対象
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.

Get CPU utilization as percentiles, not just an averageRead-only
対象
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 table

Judging 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.

Pull all the metrics needed for a sizing decision at onceRead-only
対象
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
done

If 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.

Change the instance class (involves a restart / failover)High
対象
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-immediately

Adding `--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

ColumnMeaningWhat to Check
CPUUtilization (p95 / p99 / Maximum)vCPU utilizationConsistently high p95 means CPU-bound. A low average but a high Maximum alone likely points to a specific batch job
FreeableMemoryFreeable memory amount (bytes)A persistently small value means memory-bound. The buffer pool may not be able to hold the working set
ReadIOPS / WriteIOPSRead/write I/O operations per secondWhether the sum is pegged at the provisioned IOPS — if so, adding CPU will not help
ReadThroughput / WriteThroughputRead/write bytes per secondWhether the sum is close to the instance class's EBS bandwidth ceiling — check the ceiling in the current AWS documentation
DatabaseConnectionsNumber of connectionsIf near the limit, the cause is often connection pool design rather than sizing
DBInstanceClassThe current instance classWhen using a license-included model for SQL Server, compare the total cost on the premise that the license fee is tied to vCPU count
MultiAZWhether a standby existsIf 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)

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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. 1

    List the current configuration

    Read-only

    Use `aws rds describe-db-instances` to check the class, storage type, provisioned IOPS, Multi-AZ status, and the presence of read replicas.

  2. 2

    Measure CPU as percentiles

    Read-only

    Pull CPUUtilization's p95, p99, and Maximum over a period that includes the busy season. The average alone is not enough to judge.

  3. 3

    Measure memory sufficiency

    Read-only

    Look 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. 4

    Check whether I/O is hitting a ceiling

    Read-only

    Compare 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. 5

    Inventory whether the workload can be separated

    Read-only

    Identify cross-database queries, shared master tables, and any distributed transactions. The more cross-cutting processing there is, the higher the cost of splitting.

  6. 6

    Test candidate configurations

    Low

    Run 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-only

    Narrow 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

    Low

    If 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

    Medium

    If 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

    Medium

    If 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-only

    Adding 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

    High

    A 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 Required

    Moving 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

Amazon AuroraAurora separates the storage layer, and one writer plus multiple readers is the standard setup. As with RDS, the writer cannot be horizontally split, and write scaling depends on the writer's size.
Amazon RDS for SQL ServerThe cost of the license-included model is tied to vCPU count. Check both the current AWS documentation and your license agreement for BYOL eligibility and edition-specific constraints.
Multi-AZ DB clustersA Multi-AZ DB instance (one standby) and a Multi-AZ DB cluster (two readable standbys) differ in failover behavior and whether read distribution is possible. Check support for your target engine and version.

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.

Related Knowledge

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

← Back to Knowledge Base