Advanced Databases

Chapter 10
Database Performance, Reliability and Observability

Post Graduate Program in IT Engineering
Advanced Databases   •   Post Graduate

Database Performance, Reliability and Observability

Introduction and Context

A database can be functionally correct yet operationally unsuccessful. Users experience not only incorrect results, but also slow responses, intermittent errors, lost transactions, and prolonged outages. Database engineering therefore extends beyond schema design and SQL correctness to include performance engineering, reliability engineering, capacity planning, and observability.

Performance concerns how efficiently a system processes workload. Reliability concerns whether it continues to provide correct service over time, including during component failures and operational change. Observability concerns how effectively engineers can infer internal system conditions from externally collected telemetry. These areas are interdependent: an overloaded database may produce latency spikes and failures; poorly designed high availability may increase write latency; and inadequate telemetry may delay diagnosis of both.

This chapter presents a systematic approach to workload characterization, benchmarking, query and index tuning, capacity planning, metrics, logs, traces, service-level objectives, high availability, and reliability practices.

Learning Objectives

After completing this chapter, a student should be able to:

1. Characterize database workloads using demand, concurrency, latency, throughput, and data-access patterns.

2. Design meaningful benchmarks and interpret their limitations.

3. Diagnose query and system bottlenecks using execution plans and telemetry.

4. Select indexes and tune queries while evaluating write and maintenance costs.

5. Estimate capacity using workload growth, headroom, and resource constraints.

6. Design useful metrics, logs, and traces for database operations.

7. Formulate SLIs, SLOs, error budgets, and reliability practices.

8. Compare high-availability architectures and reason about their failure modes.

9. Apply these ideas in a realistic operational case.

1. A Performance Engineering Model

Database performance is best understood as a relationship among workload, resources, data structures, and implementation. A workload is not simply a number of requests per second. It includes request types, transaction sizes, read/write proportions, data distributions, concurrency, temporal variation, and consistency requirements.

Important workload dimensions include:

  • Throughput: completed transactions, queries, or rows per unit time.
  • Latency: elapsed time from request arrival to completion. Percentiles such as p50, p95, and p99 are usually more informative than the arithmetic mean because tail latency affects a substantial user population.
  • Concurrency: number of operations simultaneously active or waiting.
  • Selectivity: proportion of rows satisfying a predicate.
  • Working set: data and index pages frequently accessed during an interval.
  • Read/write ratio: proportion of operations that read, insert, update, or delete data.
  • Burstiness: difference between average and peak demand.
  • Contention: interference caused when operations compete for locks, latches, CPU, memory, I/O, or connections.

A useful conceptual model is that response time consists of service time plus waiting time. Service time is the time spent actively processing an operation; waiting time includes queues for CPU, storage, locks, buffer pages, or connections. Improving an already small service component may have little effect when waiting dominates.

Little’s Law provides a useful steady-state relationship:

L = λW

where L is the average number of items in the system, λ is the average arrival or completion rate, and W is average time in the system. The units must be consistent: if λ is transactions per second and W is seconds, L is transactions. The law assumes a stable system over the observation interval, so the average arrival rate equals the average departure rate. It applies to a system, queue, or subsystem when the measured quantities refer to the same boundary. For example, 200 requests per second with an average response time of 0.25 seconds implies approximately 50 requests in the system. This does not by itself prove that 50 database connections are required; requests may be queued outside the database or may not hold connections for their entire lifetime.

Queueing behavior becomes nonlinear as utilization approaches saturation. Consequently, a system operating at 95 percent CPU utilization may be far less resilient to bursts than one operating at 60 percent, even if both satisfy the current average throughput requirement.

2. Workload Characterization and Benchmarking

2.1 From business activity to database workload

Characterization should begin with business transactions rather than isolated SQL statements. An order placement transaction, for example, may read inventory, insert an order, update stock, record payment state, and write an audit event. Its resource cost depends on all statements, transaction duration, locking behavior, and retry policy.

A workload inventory should record:

  • transaction classes and their business importance;
  • arrival rate by time period, including peak and seasonal demand;
  • latency objectives and tail-latency behavior;
  • transaction size and result-set size;
  • data volume, growth rate, and distribution skew;
  • consistency, durability, and isolation requirements;
  • failure and retry behavior; and
  • resource consumption by query class.

Averages conceal important structure. A reporting query run once per hour may have low throughput but consume substantial I/O and memory. A point lookup may be inexpensive individually but dominant at high frequency. Hot keys can create contention even when total traffic appears moderate.

2.2 Benchmark design

A benchmark is credible only when its workload and success criteria represent the intended use. A sound process includes:

1. Define the question: capacity limit, release comparison, configuration choice, or regression detection.

2. Select representative data volume and distributions. Uniform synthetic data can hide skew and poor selectivity.

3. Warm or deliberately cold the relevant caches, and document the choice.

4. Control client concurrency, think time, connection pooling, and transaction boundaries.

5. Measure throughput, latency percentiles, errors, resource utilization, lock waits, and replication effects.

6. Repeat trials and report variability, not only the best run.

7. Change one major factor at a time where possible.

8. Verify correctness, because a faster benchmark that omits constraints or returns incorrect results is invalid.

Microbenchmarks isolate a query or feature; macrobenchmarks reproduce an end-to-end workload. Microbenchmarks support diagnosis, whereas macrobenchmarks better predict user experience. Neither automatically predicts production: production includes background jobs, failures, cache evolution, noisy neighbors, schema drift, and traffic changes.

Benchmark results should state hardware, software versions, configuration, dataset size, cache state, concurrency, measurement interval, and statistical treatment. A performance regression is more credible when confidence intervals or repeated-run variation show that the difference is larger than measurement noise.

3. Query Tuning and Execution Plans

A query optimizer estimates alternative execution plans using statistics about tables, indexes, predicates, and data distributions. A plan may include scans, seeks, joins, sorts, aggregations, materialization, and parallel operations. Tuning begins by inspecting the actual plan and comparing estimated and actual cardinalities.

3.1 Common sources of inefficiency

A full table scan is not inherently bad. It may be optimal when a large fraction of rows is required or when the table is small. It becomes suspicious when a highly selective request scans a large relation repeatedly. Other common problems include:

  • stale or insufficient statistics;
  • predicates that prevent effective index use, such as applying functions to indexed columns;
  • implicit data-type conversion;
  • leading-wildcard searches such as `LIKE '%term'`;
  • joins on nonselective or mismatched columns;
  • accidental Cartesian products;
  • sorting or grouping large intermediate results;
  • fetching columns or rows that the application does not need;
  • excessive round trips caused by an N+1 access pattern;
  • long transactions that retain locks or old row versions; and
  • parameter-sensitive plans in systems where one plan is unsuitable for widely different parameter values.

3.2 A disciplined tuning sequence

First establish a baseline: query text, parameters, frequency, latency percentiles, rows examined and returned, CPU, logical and physical reads, waits, and errors. Next confirm that the query is functionally required and that the result set is appropriately bounded. Then inspect the actual execution plan, cardinality estimates, access paths, join order, and memory-intensive operators.

Possible interventions include rewriting predicates, reducing returned columns, pre-aggregating data, improving statistics, changing join formulation, adding an index, partitioning large tables, or altering application access patterns. Each change should be tested against representative data and concurrent workload. Query hints and forced plans can be useful emergency controls, but they increase operational coupling and may become harmful as data changes.

Optimization is not equivalent to minimizing single-query time. A plan that saves 10 milliseconds but adds substantial write amplification or memory pressure may reduce system-wide performance.

4. Indexing as a Workload Trade-off

An index is an auxiliary access structure that can reduce the data pages examined for a query. It also consumes storage, memory, maintenance I/O, and write time. Index design must therefore be workload-driven.

For a composite index, column order matters. Equality predicates commonly precede range predicates, and columns useful for ordering or covering may follow, subject to the database engine and workload. A B-tree index on `(customer_id, order_date)` can efficiently support searches restricting `customer_id` and then a date range. It is generally less useful for a query restricting only `order_date`, because the leading column is not constrained. This is a general design tendency rather than an absolute rule; optimizer behavior, skip scans, clustering, and data distribution can alter the result.

A covering index contains all columns needed by a query, potentially avoiding table lookups. However, a wide covering index increases storage and update cost. Low-cardinality columns may be poor leading keys in a conventional B-tree when queried alone, although they can be valuable in composite indexes or specialized structures.

Index evaluation should consider:

  • query frequency and business criticality;
  • selectivity and data distribution;
  • insert, update, and delete volume;
  • index size and cache residency;
  • uniqueness and integrity requirements;
  • write amplification and locking;
  • maintenance and rebuild behavior; and
  • alternative solutions such as partitioning, caching, materialized views, or search systems.

Unused-index reports require caution. An index may be needed for infrequent but critical operations, constraints, or future plans. Removal should follow observation, dependency analysis, and a rollback plan.

5. Capacity Planning

Capacity planning connects expected demand with resource limits and a reliability target. Relevant resources include CPU, memory, storage capacity, storage IOPS and latency, network bandwidth, connection slots, lock capacity, replication bandwidth, and operational staff capacity.

A basic demand projection can use a compound growth model:

D(t) = D₀(1 + g)^t

where D₀ is current demand, g is the fractional growth per planning period, and t is the number of periods. This assumes a constant growth rate and should not be treated as a forecast when growth is seasonal, stepwise, or constrained by market conditions.

Suppose a service processes 800 transactions per second today and demand is expected to grow by 15 percent annually. After two years, the projected demand is:

D(2) = 800(1.15)² = 1,058 transactions per second approximately.

If a tested database node sustains 1,500 transactions per second for the target workload, a purely throughput-based utilization estimate is 1,058/1,500, or about 70.5 percent. This does not establish safe capacity: the tested rate may exclude failover, background work, tail latency, or storage growth. Headroom must be reserved for bursts, maintenance, failover, and forecast error.

Storage planning should include primary data, indexes, temporary space, write-ahead logs or journals, backups, replicas, and retention policies. A capacity model should also identify the first constraining resource. Adding CPU does not solve storage latency; adding replicas does not automatically increase write capacity; and increasing connection limits can worsen contention.

Capacity plans should define trigger thresholds, lead times, scaling actions, and owners. Forecasts should be revisited after major schema, query, hardware, or traffic changes.

6. Observability: Metrics, Logs, and Traces

Observability is the ability to infer system state from emitted evidence. It is not equivalent to collecting every possible datum. Useful telemetry is linked to hypotheses and operational decisions.

6.1 Metrics

Database metrics commonly include:

  • request rate and transaction throughput;
  • latency distributions and timeout rates;
  • error rates by class;
  • CPU, memory, cache hit behavior, storage latency and I/O;
  • active sessions, connection-pool saturation, and queue depth;
  • lock waits, deadlocks, transaction age, and rollback rate;
  • replication lag and log shipping delay; and
  • checkpoint, vacuum, compaction, or storage-maintenance activity, depending on the engine.

Metrics should support both USE reasoning—utilization, saturation, and errors—and RED reasoning—rate, errors, and duration. Aggregating only global averages can hide a problematic query class, tenant, region, or endpoint. Labels should be useful but bounded; unbounded labels such as raw SQL text can cause cardinality explosions.

6.2 Logs

Logs provide event detail: failed statements, deadlocks, authentication events, failovers, schema changes, backup outcomes, and administrative actions. Structured logs should include timestamps, severity, operation or trace identifiers, database role, and a safe query classification. Sensitive values should be redacted or tokenized. Logging every statement and parameter may expose personal or financial data and impose substantial overhead.

6.3 Traces

Distributed traces connect an application request to database spans and downstream services. A trace can reveal that a slow API call contains many small database calls, waits for a connection, or spends time in a remote replica. Trace sampling should preserve errors, slow operations, and representative traffic. Trace context must be propagated consistently, and clock differences should be considered when interpreting cross-host timing.

A practical diagnostic workflow correlates a symptom with dimensions: time window, endpoint, query fingerprint, host, tenant, deployment, and dependency. For example, a p99 latency increase concurrent with storage latency and a rise in checkpoint activity suggests a different intervention from a p99 increase accompanied by lock waits and long transactions.

7. SLI, SLO, and Error Budgets

A service-level indicator (SLI) is a measured aspect of service behavior. For a database-backed API, availability may be defined as successful valid requests divided by total valid requests during an interval. The numerator and denominator must be specified carefully: planned maintenance, client cancellations, and invalid requests may or may not be included depending on the service contract.

A service-level objective (SLO) is a target for an SLI over a stated window. An availability SLO of 99.9 percent over a 30-day period permits an error budget of 0.1 percent. If every minute were weighted equally, 30 days contain 43,200 minutes, and 0.001 × 43,200 = 43.2 minutes. This conversion is an approximation for an availability measure based on time; request-based SLIs may produce a different budget in failed requests.

Latency SLOs should use a percentile and eligibility definition, such as “99 percent of eligible reads complete within 200 ms over 30 days.” Averages are unsuitable as the sole latency objective because a small number of severe outliers can be operationally important.

Error budgets support governance. When the budget is healthy, teams may release or make architectural changes within agreed controls. When it is being rapidly consumed, reliability work, rollout pauses, or increased testing may take priority. An SLO is not a guarantee and should not be selected merely because it sounds impressive; higher targets impose greater cost and reduce tolerance for change.

8. Reliability and High Availability

Reliability engineering addresses failures as normal possibilities rather than exceptional surprises. Important practices include failure-mode analysis, automation, safe deployment, backups, restore testing, incident response, and learning-oriented post-incident review.

High availability (HA) reduces service interruption through redundancy and controlled failover. Common patterns include:

  • Primary–standby: one writer and one or more replicas; failover promotes a standby.
  • Synchronous replication: a commit waits for acknowledgment from another node, improving data-loss protection but potentially increasing write latency and reducing availability under network partition.
  • Asynchronous replication: the primary acknowledges before replicas are fully current, usually improving write latency but permitting replication lag and possible data loss during primary failure.
  • Shared-nothing distributed databases: partitions are placed across nodes, offering scale and fault isolation but adding coordination, rebalancing, and operational complexity.
  • Read replicas: scale selected reads, but applications must understand staleness and read-after-write behavior.

A replica is not automatically a backup. Corruption, accidental deletion, or a replicated bad migration can propagate to replicas. Backups require retention, access controls, encryption, integrity verification, and restoration exercises. Recovery objectives should be explicit:

  • RPO (Recovery Point Objective): maximum tolerable loss of data measured in time.
  • RTO (Recovery Time Objective): maximum tolerable time to restore service.

Failover design must address split-brain, stale replicas, fencing, leader election, DNS or routing convergence, connection draining, idempotent retries, and client behavior. Retrying a transaction without understanding commit ambiguity can create duplicates. Idempotency keys, transactional outboxes, and carefully designed recovery procedures reduce this risk.

Reliability also depends on change management. Expand-and-contract schema migrations, backward-compatible application versions, online index operations where supported, canary releases, and tested rollback paths reduce outage probability.

9. Governance, Security, and Ethical Responsibilities

Performance telemetry can become a source of privacy risk. Query parameters, account identifiers, traces, and logs may contain personal or confidential information. Organizations should apply data minimization, purpose limitation, access control, encryption, retention limits, auditability, and appropriate redaction. Regulatory obligations vary by jurisdiction and sector, but the principles of least privilege and demonstrable control are broadly applicable.

Database administrators and engineers must not optimize solely for a local metric if doing so harms users or violates policy. For example, disabling durable logging may improve benchmark throughput while increasing data-loss risk. AI-assisted query recommendations can accelerate analysis, but generated advice requires verification against execution plans, security constraints, workload conditions, and change-control procedures. Training or sending production SQL to external services may itself disclose sensitive information.

10. Illustrative Case: Diagnosing a Retail Order-Service Incident

Background

A fictional online retailer operates a relational order database. The order API has a p95 latency target of 300 ms and a monthly availability SLO of 99.9 percent. During a promotional event, order latency rises sharply and some requests time out.

Problem

The dashboard shows throughput increasing from 350 to 600 orders per second, p99 latency rising from 420 ms to 4.8 seconds, and timeout errors reaching 2 percent. CPU is 65 percent, so an initial proposal is to add CPU.

Analysis

Traces show that the order endpoint waits for a database connection before executing SQL. Database metrics show connection-pool saturation and a growing queue. Lock-wait metrics identify contention on the inventory table. Query fingerprints reveal a newly deployed inventory query that scans many rows because a predicate applies a function to the indexed SKU column. The query is executed once per item in an order, producing an N+1 pattern. Long transactions hold inventory locks while an external payment call is performed.

CPU is not the first bottleneck. The system is limited by connection occupancy, lock duration, and inefficient access paths. The incident demonstrates why a single resource metric cannot explain end-to-end latency.

Approach and Solution

The team first disables the problematic feature through a controlled flag and restores the previous query plan. It then adds a compatible composite index after testing write overhead, rewrites the predicate to preserve index use, and batches inventory retrieval for all order items. The transaction is divided so that the external payment interaction does not hold inventory locks; the resulting design uses an explicit state transition and an idempotency key. Connection-pool limits are recalibrated rather than blindly increased. A load test using promotional data distributions validates p95 and p99 behavior under peak traffic.

The team also adds alerts for pool wait time, lock age, query-plan changes, and error-budget consumption. A failover and restore exercise is scheduled separately because the incident exposed operational risks beyond query speed.

Outcome

In the follow-up test, throughput reaches the target with p95 latency below the SLO and substantially reduced p99 latency. The change is accepted only after correctness, duplicate prevention, rollback, and replica behavior are verified.

Learning Points

1. End-to-end traces can locate waiting outside the SQL execution interval.

2. CPU headroom does not imply database headroom.

3. Query, transaction, and application design must be tuned together.

4. Connection limits are control mechanisms, not substitutes for removing contention.

5. Reliability work includes correctness and recovery, not merely speed.

11. Challenges and Contemporary Directions

Modern databases increasingly combine transactional processing, analytics, search, and distributed deployment. Cloud elasticity can reduce provisioning delay but does not eliminate quotas, noisy neighbors, network variation, or cost governance. Serverless and autoscaling systems make cold starts, connection storms, and rapid workload shifts important observability dimensions.

Observability platforms are moving toward unified telemetry, continuous profiling, plan-change detection, and automated anomaly detection. Machine learning can identify unusual latency or resource patterns, but correlation is not causation. Automated remediation should be bounded by safety checks, approval policies, and rollback mechanisms. Emerging distributed SQL systems provide stronger geographic resilience and horizontal scale, but consistency, coordination latency, partition placement, and operational complexity remain design considerations.

The enduring best practice is closed-loop engineering: define a user-relevant objective, measure representative behavior, form a hypothesis, make a controlled change, validate correctness and reliability, and record the result for future decisions.

Chapter Summary

Database performance depends on workload characteristics, access paths, resource contention, and queueing behavior. Workload characterization must include transaction mix, concurrency, distributions, peak demand, and consistency requirements. Benchmarks are meaningful only when data, cache state, concurrency, correctness, and measurement methods are representative and documented.

Query tuning uses baselines and actual execution plans to identify cardinality errors, inefficient predicates, excessive round trips, sorting, locking, and unsuitable access paths. Indexes can reduce reads but impose storage and write-maintenance costs. Capacity planning projects demand, identifies the constraining resource, and reserves headroom for bursts, failover, maintenance, and uncertainty.

Observability combines metrics, structured logs, and traces. Correlating rate, errors, duration, waits, resource saturation, query fingerprints, and deployment events supports diagnosis. SLIs and SLOs translate user expectations into measurable objectives, while error budgets connect reliability with release governance. HA requires explicit choices about replication, consistency, failover, RPO, RTO, backups, and recovery. Finally, performance and reliability engineering must incorporate privacy, security, change management, operational learning, and responsible use of automation and AI.

Key Terms

Workload characterization: Systematic description of transaction mix, demand, data, concurrency, and operational behavior.

Throughput: Amount of completed work per unit of time.

Latency: Elapsed time required to complete an operation.

Tail latency: High-percentile latency, such as p95 or p99.

Concurrency: Number of operations active or waiting at the same time.

Contention: Competition among operations for shared resources.

Little’s Law: Steady-state relationship L = λW among system population, throughput, and average time.

Benchmark: Controlled performance measurement using a defined workload.

Execution plan: Optimizer-selected strategy for executing a query.

Cardinality estimate: Optimizer estimate of rows produced by an operation.

Selectivity: Fraction of rows satisfying a predicate.

Composite index: Index containing multiple ordered columns.

Capacity planning: Forecasting demand and resources while reserving operational headroom.

Observability: Ability to infer internal state from emitted telemetry.

Service-level indicator: Measured representation of service behavior.

Service-level objective: Target value or range for an SLI over a defined period.

Error budget: Permitted unreliability implied by an SLO.

Recovery Point Objective: Maximum acceptable period of data loss.

Recovery Time Objective: Maximum acceptable time to restore service.

Idempotency: Property that repeating an operation does not create an unintended additional effect.

Review Questions

Short Answer Questions

1. Why are p95 and p99 latency often more useful than average latency?

2. State Little’s Law and explain the units of its variables.

3. Give two reasons why an index can improve reads but harm overall performance.

4. Distinguish an SLI from an SLO.

5. Why is a replica not necessarily a backup?

Long Answer Questions

1. Describe a complete methodology for designing and evaluating a production database benchmark.

2. Explain how execution plans, cardinality estimates, statistics, and indexes interact during query tuning.

3. Discuss the trade-offs among synchronous replication, asynchronous replication, and read replicas.

4. Develop a capacity-planning approach for a database service with seasonal demand and a strict latency SLO.

5. Explain how metrics, logs, and traces complement one another during diagnosis of a distributed database incident.

Analytical / Application Questions

1. A service receives 240 requests per second and has an average end-to-end response time of 0.4 seconds. Use Little’s Law to estimate the average number of requests in the system, then explain why this is not automatically the required connection-pool size.

2. A query’s p99 latency increases after a release, while CPU remains stable and lock-wait time rises. Propose a diagnostic sequence and identify at least three possible causes.

3. A database has a 99.95 percent monthly availability SLO. Calculate the approximate monthly error budget in minutes for a 30-day month, state the assumption behind the calculation, and explain how a request-based SLI could produce a different interpretation.

Multiple Choice Questions with Answers

Question 1

A service processes 200 requests per second with an average response time of 0.25 seconds. According to Little’s Law, what is the average number of requests in the system?

A. 25

B. 50

C. 80

D. 800

Correct Answer: B. 50

Question 2

Which benchmark characteristic most directly helps reveal problems caused by skewed data distributions?

A. Using uniform random values only

B. Using representative production-like distributions

C. Running a single trial

D. Measuring CPU but not latency

Correct Answer: B. Using representative production-like distributions

Question 3

Which statement about a full table scan is correct?

A. It is always evidence of a missing index

B. It is never appropriate for large tables

C. It can be optimal when a large fraction of rows is needed

D. It guarantees low write overhead

Correct Answer: C. It can be optimal when a large fraction of rows is needed

Question 4

Why does column order matter in a composite B-tree index?

A. Only the last column can be used for filtering

B. Leading columns generally determine which access patterns can use the index efficiently

C. Column order changes the table’s logical row order permanently

D. Composite indexes cannot support range predicates

Correct Answer: B. Leading columns generally determine which access patterns can use the index efficiently

Question 5

Which telemetry combination is most useful for identifying that an API is waiting for database connections rather than executing SQL?

A. Only total database storage capacity

B. Connection-pool wait time, traces, and active-session metrics

C. Only average CPU utilization

D. Backup retention duration and table names

Correct Answer: B. Connection-pool wait time, traces, and active-session metrics

Question 6

A 99.9 percent availability SLO over a 30-day month permits approximately how many minutes of unavailability, assuming time-based measurement?

A. 4.32 minutes

B. 14.4 minutes

C. 43.2 minutes

D. 432 minutes

Correct Answer: C. 43.2 minutes

Question 7

What is the principal trade-off of synchronous replication compared with asynchronous replication?

A. It always eliminates the need for backups

B. It can improve data-loss protection while increasing commit latency or reducing availability during communication failure

C. It cannot support failover

D. It guarantees zero query latency

Correct Answer: B. It can improve data-loss protection while increasing commit latency or reducing availability during communication failure

Question 8

Which practice most directly reduces the risk of duplicate effects when a client retries after an uncertain transaction outcome?

A. Increasing log verbosity only

B. Using idempotency keys

C. Disabling transaction durability

D. Removing all unique constraints

Correct Answer: B. Using idempotency keys

Question 9

If current demand is 800 transactions per second and annual growth is 15 percent, what is the approximate demand after two years under the stated compound-growth assumption?

A. 920 transactions per second

B. 1,000 transactions per second

C. 1,058 transactions per second

D. 1,200 transactions per second

Correct Answer: C. 1,058 transactions per second

Question 10

Which statement best describes an error budget?

A. The maximum database storage allocated to logs

B. The reliability shortfall permitted by an SLO over its measurement period

C. The number of indexes allowed on a table

D. The time required to rebuild a replica

Correct Answer: B. The reliability shortfall permitted by an SLO over its measurement period

Advanced Databases
Chapter 10 of 15