Skip to content

AxonOps — AI-Native Control Plane for Open Source Data Platforms

Cassandra Unified Compaction Strategy (UCS)

UCS (Cassandra 5.0+) is an adaptive compaction strategy that unifies tiered and leveled compaction, using sharding and density-based triggering to provide flexible compaction behavior across varying workloads.


Unified Compaction Strategy was introduced in Cassandra 5.0 (CEP-26). The key observation driving UCS, as stated in the design document, is that tiered and leveled compaction can be generalized as the same density-based framework: both form exponentially-growing levels based on SSTable density and trigger compaction when a threshold number of SSTables are present on one level. UCS provides a unified framework where this trade-off is configurable through scaling_parameters.

Each traditional strategy has fundamental limitations:

STCS limitations:

  • No upper bound on read amplification
  • Large SSTables accumulate without compacting
  • Space amplification during major compactions

LCS limitations:

  • High write amplification (~10× per level)
  • L0 backlog under write pressure
  • Cannot keep pace with write-heavy workloads

TWCS limitations:

  • Only suitable for append-only time-series
  • Breaks with out-of-order writes or updates
  • Tombstone handling issues

UCS addresses these by:

  1. Unifying the compaction model: A single configurable strategy unifies tiered and leveled compaction within one implementation
  2. Sharding: Shard-aligned token boundaries used to split output and improve parallelism
  3. Density-based triggering: Compaction decisions based on data density, not just counts
  4. Configurable read/write trade-off: scaling_parameters adjusts behavior

UCS introduces several concepts that differ from traditional strategies:

Shards: UCS uses shard-aligned token boundaries to split flush and compaction output. The effective number of shards is density-dependent, and sharding helps bound SSTable size and improve parallelism.

Runs: A sequence of SSTables that collectively represent one "generation" of data. Runs replace the concept of levels (LCS) or tiers (STCS).

Density: The amount of data per token range unit. UCS triggers compaction when density reaches thresholds, not when SSTable counts reach thresholds.

Scaling Parameters: One or more values (for example T4 or T4, T4, L10) that determine whether UCS behaves more tiered or more leveled at each level.

Token Range Sharding (base_shard_count = 4)Token Range Sharding (base_shard_count = 4)Shard 0[-2^63, -2^61)Shard 1[-2^61, 0)Shard 2[0, 2^61)Shard 3[2^61, 2^63]SSTableSSTableSSTableShard-alignedoutputSSTableSSTableSSTableShard-alignedoutputSSTableSSTableSSTableShard-alignedoutputSSTableSSTableSSTableShard-alignedoutputOutput is split at shard boundariesenabling parallelism andbounded SSTable size

UCS uses shard boundaries to split output SSTables at token boundaries. This helps:

  • Parallelism: Output can be split across multiple shard-aligned writers
  • Bounded scope: Output SSTables are constrained by shard boundaries
  • Consistent layout: Lower-level split points remain valid for higher-density levels

Example Only

The diagram above illustrates a fixed base shard count. In practice, UCS shard count is determined dynamically from density and may be below, equal to, or above base_shard_count.

When scaling_parameters starts with T (e.g., T4), UCS behaves similarly to STCS:

T4 Behavior Within a ShardT4 Behavior Within a Shard1 MB1 MB1 MB1 MB4 MBWrite amplification: ~log4(data_size)Read amplification: multiple SSTables per querycompact when4 accumulate

The number after T specifies the fanout—how many SSTables accumulate before compaction. Higher values (T8, T16) reduce write amplification but increase read amplification.

When scaling_parameters starts with L (e.g., L10), UCS behaves similarly to LCS:

L10 Behavior Within a ShardL10 Behavior Within a ShardLevel 0Level 1Level 2flushflushflushflush~10x L0 size~10x L1 sizeWrite amplification: ~10x per levelRead amplification: bounded (one SSTable per level per shard)compact to L1when threshold reachedpromote when L1 full

The number after L specifies the size ratio between levels. L10 means each level is 10× larger than the previous, matching classic LCS behavior.

Unlike traditional strategies that trigger on SSTable count, UCS uses density:

d=svd = \frac{s}{v}

Where:

  • dd = density
  • ss = SSTable size
  • vv = fraction of token space covered by the SSTable

Traditional (count-based): Trigger when SSTable count≥min threshold\text{SSTable count} \geq \text{min threshold}

  • Problem: Doesn't account for SSTable sizes or overlap

UCS (density-based): Trigger when density exceeds threshold for shard

  • Advantage: Considers actual data distribution

Example:

  • Shard covers 25% of token range (v=0.25v = 0.25)
  • Shard contains 10GB of data (s=10GBs = 10\text{GB})
  • Density d=10GB0.25=40GBd = \frac{10\text{GB}}{0.25} = 40\text{GB} effective
  • If target density is 32GB, compaction triggers

This approach prevents the "large SSTable accumulation" problem of STCS while avoiding unnecessary compaction of sparse data.

SSTables are assigned to levels based on their size relative to the memtable flush size:

L={⌊log⁡fsm⌋if s≥m0otherwiseL = \begin{cases} \left\lfloor \log_f \frac{s}{m} \right\rfloor & \text{if } s \geq m \\ 0 & \text{otherwise} \end{cases}

Where:

  • LL = level number
  • ff = fanout (derived from scaling parameter)
  • ss = SSTable size (or density in sharded mode)
  • mm = memtable flush size (observed or overridden via flush_size_override)

This creates exponentially-growing size ranges per level:

LevelMin SSTable sizeMax SSTable size
00m⋅fm \cdot f
1m⋅fm \cdot fm⋅f2m \cdot f^2
2m⋅f2m \cdot f^2m⋅f3m \cdot f^3
nm⋅fnm \cdot f^nm⋅fn+1m \cdot f^{n+1}

Level 0 contains SSTables below m×fm \times f, level 1 contains SSTables from m×fm \times f up to m×f2m \times f^2, level 2 from m×f2m \times f^2 up to m×f3m \times f^3, and so on.

The maximal number of levels for a dataset is inversely proportional to log⁡f\log f — substituting the maximal dataset size DD into the level formula above gives the upper bound.


The primary advantage of UCS is tunable behavior:

  • T4: STCS-like, optimize for writes
  • L10: LCS-like, optimize for reads
  • T8, L4, etc.: Intermediate points on the spectrum
  • Change with ALTER TABLE—no data rewrite needed

Sharding enables efficient use of modern hardware:

  • Output split across shard-aligned writers enables concurrent work
  • Shard boundaries provide consistent split points across density levels
  • Scales with CPU core count
  • Reduces wall-clock time for compaction

Even in tiered mode, UCS provides better bounds than STCS:

  • Shard-bounded output and overlap-based selection help keep read amplification more predictable
  • Density-based triggering prevents unbounded accumulation
  • More predictable read performance

Single strategy implementation simplifies Cassandra:

  • A single implementation reduces the complexity of maintaining separate compaction strategies
  • Consistent behavior across configurations
  • Easier to test and maintain
  • Bug fixes benefit all configurations

Transitioning from traditional strategies is straightforward:

  • ALTER TABLE to enable UCS immediately
  • Existing SSTables remain valid
  • Gradual transition as compaction runs
  • No major compaction required

UCS has less production history than traditional strategies:

  • Introduced in Cassandra 5.0
  • Less community experience with edge cases
  • Fewer tuning guides and best practices available
  • Some workloads may have undiscovered issues

Different conceptual model requires adjustment:

  • Shards and runs vs levels and tiers
  • Density-based vs count-based triggering
  • New configuration parameters to understand
  • Existing STCS/LCS expertise doesn't directly transfer

TWCS and UCS each have strengths for time-series workloads:

  • TWCS drops entire SSTables on TTL expiry (efficient for pure append-only data)
  • UCS handles out-of-order writes and updates more gracefully than TWCS
  • UCS can be configured for time-series using higher tiered fanout (e.g., T8) with expired_sstable_check_frequency_seconds tuned for the TTL pattern
  • The Apache Cassandra documentation recommends UCS for most workloads, including time-series

Sharding adds some overhead:

  • Minimum SSTable size per shard
  • More metadata to track
  • Very small tables may not benefit
  • Configuration requires understanding data size

Major Compaction Behavior

When maximal compaction is requested, UCS groups SSTables into non-overlapping sets and creates one compaction task per set, with output split across shard boundaries. The number of tasks depends on the overlap structure of the data, not directly on base_shard_count. Verify actual behavior in the target environment before assuming a specific level of parallelism.

While migration is smooth, considerations exist:

  • Existing tuning may not transfer directly
  • Monitoring dashboards need updates
  • Operational procedures may need revision
  • Testing required before production migration

Workload PatternConfigurationWhy UCS Works
New Cassandra 5.0+ clustersT4 (default)Modern, unified approach
Mixed read/write workloadsT4Balanced trade-offs
High-core-count serversbase_shard_count=16Parallel compaction
Workloads that evolveT4, then adjustEasy reconfiguration
Large datasetsT4, target_sstable_size=5GiBEfficient compaction
Workload PatternAlternativeRationale
Cassandra < 5.0STCS/LCSUCS not available
Well-tuned existing clusterKeep currentMigration has risk
Very small tablesSTCSShard overhead not justified

UCS and Time-Series Workloads

The Apache Cassandra 5.0 documentation recommends UCS for most workloads including time-series, and provides a time-series configuration example using T8 with expired_sstable_check_frequency_seconds=300. TWCS remains a valid choice for pure append-only time-series with TTL, but UCS should not be ruled out without testing.


UCS divides the token range into shards, enabling:

  • Output splitting: Compaction output is split across shard boundaries, allowing parallelism and better size control
  • Bounded SSTable size: Output SSTables are constrained by shard boundaries
  • Consistent split points: Shard boundaries for a given density are also boundaries for all higher densities
Token range: -2^63 to 2^63
With 4 base shards:
Shard 0: tokens -2^63 to -2^61
Shard 1: tokens -2^61 to 0
Shard 2: tokens 0 to 2^61
Shard 3: tokens 2^61 to 2^63
Output SSTables are written according to shard boundaries, while
compaction selection is driven by density levels and overlap relationships.

The number of shards scales dynamically with data density using a four-case formula:

S={1if d<mmin⁡(2⌊log⁡2dm⌋,x)if d<m⋅b, where x is the largest power-of-2 divisor of bbif d<t⋅b2⌊(1−λ)⋅log⁡2(dt⋅1b)⌉⋅botherwiseS = \begin{cases} 1 & \text{if } d < m \\ \min\left(2^{\lfloor \log_2 \frac{d}{m} \rfloor}, x\right) & \text{if } d < m \cdot b \text{, where } x \text{ is the largest power-of-2 divisor of } b \\ b & \text{if } d < t \cdot b \\ 2^{\lfloor (1-\lambda) \cdot \log_2 (\frac{d}{t} \cdot \frac{1}{b}) \rceil} \cdot b & \text{otherwise} \end{cases}

Where:

  • SS = number of shards
  • dd = density (data size / token fraction)
  • mm = min_sstable_size (default: 100 MiB)
  • bb = base_shard_count (default: 4)
  • xx = largest power-of-2 divisor of bb (e.g. if b=12b = 12, then x=4x = 4)
  • tt = target_sstable_size (default: 1 GiB)
  • λ\lambda = sstable_growth (default: 0.333)
  • ⌊⋅⌉\lfloor \cdot \rceil = round to nearest integer

Case breakdown:

  1. Very small data (d<md < m): Single shard, no splitting
  2. Small data (d<m⋅bd < m \cdot b): Shard count grows up to base count
  3. Medium data (d<t⋅bd < t \cdot b): Fixed at base shard count
  4. Large data: Shard count doubles as density increases, modulated by growth factor λ\lambda

This ensures power-of-two boundaries for efficient token range splitting while preventing over-sharding of small datasets.

The sstable_growth parameter (λ\lambda) controls the trade-off between increasing shard count vs. increasing SSTable size:

λ\lambda ValueShard GrowthSSTable SizeUse Case
0Grows with densityFixed at targetMany small SSTables, maximum parallelism
0.333 (default)Intermediate growthSSTable size grows as the cubic root of density growthBalanced: both grow moderately
0.5Square-root growthSquare-root growthEqual growth for both
1Fixed at base countGrows with densityFewer large SSTables, less parallelism

Note: Actual behavior depends on data distribution and may not match theoretical growth patterns exactly.

Detailed effects:

  • λ=0\lambda = 0: Shard count grows proportionally with density; SSTable size stays fixed at target_sstable_size
  • λ=0.333\lambda = 0.333: SSTable size growth is the cubic root of density growth; equivalently, SSTable size grows with the square root of the growth of the shard count
  • λ=0.5\lambda = 0.5: When density quadruples, both SSTable size and shard count double
  • λ=1\lambda = 1: Shard count fixed at base_shard_count; SSTable size grows linearly with density

Compaction output SSTables target sizes between:

st2≤output size≤st×2\frac{s_t}{\sqrt{2}} \leq \text{output size} \leq s_t \times \sqrt{2}

Where sts_t = target_sstable_size.

With default 1 GiB target:

  • Minimum: 10242≈724\frac{1024}{\sqrt{2}} \approx 724 MiB
  • Maximum: 1024×2≈14481024 \times \sqrt{2} \approx 1448 MiB

SSTables are split at predefined power-of-two shard boundaries, ensuring consistent boundaries across all density levels.


CREATE TABLE my_table (
id uuid PRIMARY KEY,
data text
) WITH compaction = {
'class': 'UnifiedCompactionStrategy',
-- Scaling parameter (strategy behavior)
-- T = Tiered (STCS-like), number is fanout
-- L = Leveled (LCS-like), number is fanout
-- N = Balanced (midpoint between tiered and leveled, equivalent to T2/L2)
'scaling_parameters': 'T4',
-- Target SSTable size
'target_sstable_size': '1GiB',
-- Base shard count
'base_shard_count': 4,
-- Minimum SSTable size (prevents over-sharding small data)
'min_sstable_size': '100MiB'
};
ParameterDefaultDescription
scaling_parametersT4Strategy behavior: T (tiered), L (leveled), N (balanced) with fanout. Controls the read/write trade-off. Multiple comma-separated values can specify different behavior per level.
target_sstable_size1 GiBTarget size for output SSTables. Actual sizes may vary between √0.5 and √2 times this value based on sharding calculations.
base_shard_count4Base shard count used by UCS when determining output sharding. Actual shard count scales with data density using the sstable_growth modifier. Must be a positive integer.
min_sstable_size100 MiBMinimum SSTable size before sharding applies. Data below this threshold is not split into shards. A value of 0 disables this limit.
sstable_growth0.333Controls how shard count grows with data density. Range 0-1. Value of 0 maintains fixed target size; 1 prevents splitting beyond base count. At the default of 0.333, SSTable size growth is the cubic root of density growth (equivalently, SSTable size grows with the square root of the growth of the shard count).
flush_size_override0Override for expected flush size. When 0, derived automatically from observed flush operations (rounded to whole MB).
max_sstables_to_compact0Maximum SSTables per compaction. Value of 0 defaults to Integer.MAX_VALUE (effectively unlimited).
expired_sstable_check_frequency_seconds600How often to check for fully expired SSTables that can be dropped.
unsafe_aggressive_sstable_expirationfalseDrop SSTables without tombstone checking. Same semantics as TWCS.
overlap_inclusion_methodTRANSITIVEHow to identify overlapping SSTables. TRANSITIVE uses transitive closure; alternatives available for specific use cases.
ParameterDefaultDescription
enabledtrueEnables background compaction.
tombstone_threshold0.2Ratio of droppable tombstones that triggers single-SSTable compaction.
tombstone_compaction_interval86400Minimum seconds between tombstone compaction attempts.
unchecked_tombstone_compactionfalseBypasses tombstone compaction eligibility pre-checking.
only_purge_repaired_tombstonesfalseOnly purge tombstones from repaired SSTables.
log_allfalseEnables detailed compaction logging.

The following constraints are enforced during configuration:

ParameterConstraint
target_sstable_sizeMinimum 1 MiB
min_sstable_sizeMust be >= 0; if nonzero, must be < target_sstable_size × √0.5 (approximately 70% of target)
base_shard_countMust be positive integer
sstable_growthMust be between 0.0 and 1.0 (inclusive)
flush_size_overrideIf specified, minimum 1 MiB
expired_sstable_check_frequency_secondsMust be positive
scaling_parametersMust match format: N, L[2+], T[2+], or signed integer

The scaling_parameters option controls compaction behavior through an internal scaling factor W.

T<number> = Tiered (STCS-like behavior), number is fanout (must be ≥ 2)
L<number> = Leveled (LCS-like behavior), number is fanout (must be ≥ 2)
N = Balanced (midpoint between tiered and leveled, equivalent to T2/L2)
<integer> = Raw W value (signed integer, positive = tiered, negative = leveled)

The scaling parameter is converted to an internal value WW:

W={n−2for Tn (e.g., T4→W=2)2−nfor Ln (e.g., L10→W=−8)0for N (balanced)W = \begin{cases} n - 2 & \text{for } T_n \text{ (e.g., } T_4 \rightarrow W = 2\text{)} \\ 2 - n & \text{for } L_n \text{ (e.g., } L_{10} \rightarrow W = -8\text{)} \\ 0 & \text{for } N \text{ (balanced)} \end{cases}

From WW, the fanout (ff) and threshold (tt) are calculated:

f={2−Wif W<02+Wotherwisef = \begin{cases} 2 - W & \text{if } W < 0 \\ 2 + W & \text{otherwise} \end{cases}

t={2if W≤02+Wotherwiset = \begin{cases} 2 & \text{if } W \leq 0 \\ 2 + W & \text{otherwise} \end{cases}

ParameterWWffttBehavior
T4244Tiered: 4 SSTables trigger compaction, 4×4\times size growth
T8688Very tiered: higher threshold, more write-optimized
N022Balanced: minimal fanout and threshold
L4-242Leveled: low threshold, more read-optimized
L10-8102Very leveled: 10×10\times fanout, aggressive compaction

Multiple values can be specified for different levels:

'scaling_parameters': 'T4, T4, L10'
-- Level 0: T4 behavior
-- Level 1: T4 behavior
-- Level 2+: L10 behavior (last value repeats)

This enables hybrid strategies where upper levels are tiered (write-optimized) and lower levels are leveled (read-optimized).


-- STCS with min_threshold=4 equivalent
ALTER TABLE keyspace.table WITH compaction = {
'class': 'UnifiedCompactionStrategy',
'scaling_parameters': 'T4'
};
-- LCS equivalent
ALTER TABLE keyspace.table WITH compaction = {
'class': 'UnifiedCompactionStrategy',
'scaling_parameters': 'L10',
'target_sstable_size': '160MiB'
};
  1. UCS takes effect immediately on ALTER
  2. Existing SSTables are not rewritten
  3. New compactions follow UCS rules
  4. Gradual transition as old SSTables compact
Terminal window
# Monitor migration
watch 'nodetool compactionstats && nodetool tablestats keyspace.table'

ALTER TABLE keyspace.table WITH compaction = {
'class': 'UnifiedCompactionStrategy',
'scaling_parameters': 'T8', -- Higher threshold, less frequent compaction
'target_sstable_size': '2GiB', -- Larger SSTables
'base_shard_count': 4
};
ALTER TABLE keyspace.table WITH compaction = {
'class': 'UnifiedCompactionStrategy',
'scaling_parameters': 'L10', -- Leveled for low read amp
'target_sstable_size': '256MiB', -- Smaller SSTables for faster compaction
'base_shard_count': 8 -- More parallelism
};
ALTER TABLE keyspace.table WITH compaction = {
'class': 'UnifiedCompactionStrategy',
'scaling_parameters': 'T4',
'target_sstable_size': '5GiB', -- Larger to reduce SSTable count
'base_shard_count': 16 -- More shards for parallelism
};
ALTER TABLE keyspace.table WITH compaction = {
'class': 'UnifiedCompactionStrategy',
'scaling_parameters': 'T4',
'base_shard_count': 16, -- Match available cores
'target_sstable_size': '1GiB'
};

MetricHealthyInvestigate
Pending compactions<20>50
SSTable count per shardConsistentHighly variable
Compaction throughputSteadyDropping
Terminal window
# Compaction activity
nodetool compactionstats
# Table statistics
nodetool tablestats keyspace.table
# JMX metrics for detailed shard info
# org.apache.cassandra.metrics:type=Table,name=*
# Pending compactions
org.apache.cassandra.metrics:type=Compaction,name=PendingTasks
# Per-table compaction metrics
org.apache.cassandra.metrics:type=Table,keyspace=*,scope=*,name=PendingCompactions
org.apache.cassandra.metrics:type=Table,keyspace=*,scope=*,name=LiveSSTableCount

AspectSTCSLCSTWCSUCS
Write amplificationLowHighLowConfigurable
Read amplificationHighLowLowConfigurable
Space amplificationMediumLowLowLow
ParallelismLimitedLimitedLimitedImproved (shard-enabled)
AdaptabilityFixedFixedFixedConfigurable
Cassandra versionAllAll3.0+5.0+
  1. Single strategy for multiple workloads: Adjust scaling_parameters instead of switching strategies
  2. Better parallelism: Sharding enables multi-core utilization
  3. Density-based triggering: More intelligent than fixed thresholds
  4. Unified codebase: Simplified maintenance through a single configurable implementation
  1. Newer strategy: Less production experience than STCS/LCS
  2. Migration complexity: Existing clusters need careful transition
  3. Learning curve: Different configuration model

The overlap_inclusion_method parameter controls how UCS extends the set of SSTables selected for compaction:

When an SSTable is selected for compaction, all transitively overlapping SSTables are included:

If A overlaps B and B overlaps C:
→ A, B, and C are all included in the same compaction
(even if A and C don't directly overlap)
Algorithm: O(n log n) time complexity
Forms minimal disjoint lists where overlapping SSTables belong together

This is the default and recommended setting. It ensures compaction fully resolves overlaps, reducing future read amplification.

Experimental

SINGLE is implemented for experimentation purposes only and is not recommended for production use with UCS sharding.

Extension occurs only once from the initially selected SSTables:

If A is selected and overlaps B and C:
→ A, B, and C are included
But if B also overlaps D:
→ D is NOT included (no transitive extension)

Use this when compaction scope needs to be limited, at the cost of potentially leaving some overlaps unresolved.

Experimental

NONE is implemented for experimentation purposes only and is not recommended for production use with UCS sharding.

No overlap extension occurs. Only directly selected SSTables are compacted:

Only the initially selected bucket is compacted
Overlapping SSTables in other buckets are not included

Not recommended for most use cases as it may leave significant overlaps, degrading read performance.


This section documents implementation details from the Cassandra source code.

UCS supports up to 32 levels (MAX_LEVELS = 32), sufficient for petabytes of data. This accommodates 2^32 SSTables at minimum 1MB each.

ShardManager provides shard boundaries and density-aware comparisons used by UCS. The effective number of output shards is derived from density through the controller (and may be below, equal to, or above base_shard_count), and output is split using ShardTracker.

The selection algorithm prioritizes efficiency and coverage:

Selection process:
1. Filter unsuitable SSTables (suspect, early-open)
2. Exclude currently compacting SSTables
3. Organize remaining SSTables by density into levels (up to 32)
4. Form buckets by overlap relationships within each level
5. Find buckets with highest overlap count
6. Among equal candidates:
- Prioritize LOWEST levels (cover larger token fraction for same work)
- Random uniform selection within same level (reservoir sampling)
7. Extend selection using overlap_inclusion_method

Level prioritization rationale: Lower levels cover a larger fraction of the token space for the same amount of compaction work, making them more efficient targets.

When maximal compaction is requested, UCS groups SSTables into non-overlapping sets and creates one compaction task per set. The output of those tasks is then split across shard boundaries according to density. This can provide parallelism, but the number of tasks should not be assumed to equal base_shard_count.

Compaction output is split at power-of-two shard boundaries, with shard count derived from density through the controller.

The overlap detection algorithm forms a minimal list of overlap sets satisfying three properties:

  1. Non-overlapping SSTables never share a set
  2. Overlapping SSTables exist together in at least one set
  3. SSTables occupy consecutive positions within sets
Algorithm:
1. Sort SSTables by first token
2. Iterate through sorted list
3. Extend current set while SSTables overlap
4. Close set and start new when gap found
5. Result: minimal lists where all overlapping SSTables are grouped
Time complexity: O(n log n)

Example: If SSTables A, B, C, D cover tokens 0-3, 2-7, 6-9, 1-8 respectively:

  • Overlap sets computed: {A, B, D} and {B, C, D}
  • A and C don't overlap, so they're in separate sets
  • A, B, D overlap at token 2 → must be in at least one set together
  • B, C, D overlap at token 7 → must be in at least one set together

The overlap sets determine read amplification: any key lookup touches at most one SSTable per non-overlapping set.

ConstantValueDescription
MAX_LEVELS32Maximum hierarchy depth
Default scaling_parametersT4Tiered with fanout/threshold of 4
Default target_sstable_size1 GiBTarget output SSTable size
Default base_shard_count4Initial token range divisions
Default sstable_growth0.333SSTable size growth = cubic root of density growth
Default expired check600 secondsTTL expiration check frequency
Output size rangetarget/√2 to target×√2Actual output SSTable size bounds