MinervaDB · SQL Server Support · SQL Server 2016 to 2025, Always On, Query Store, Azure SQL
SQL Server Support and Remote DBA: 24×7 Engineering for SQL Server That Cannot Stop
Most SQL Server incidents announce themselves in the wait statistics long before users call: a plan that changed after a statistics update, a synchronous replica that slowed every commit, a log file on slow storage. MinervaDB SQL Server Support reads that evidence first, fixes the cause rather than the symptom, and runs your estate 24×7 with a 15-minute Severity-1 response from engineers who work on SQL Server every day.
Scope
What MinervaDB SQL Server Support covers
SQL Server Support at MinervaDB spans the full lifecycle of the engine: design, tuning, high availability, upgrades and daily operations, on Windows and Linux, on premises and in any cloud. We support SQL Server alongside PostgreSQL, MySQL and the rest of the estate, which is why our advice on when SQL Server is the right engine is credible.
24×7 support
SQL Server Support under SLA: incident response, root cause analysis and a written fix, with the evidence query behind every finding.
Performance engineering
Wait analysis, Query Store regressions, indexing and memory grants. Deep dives run as a SQL Server performance audit.
High availability and DR
Always On availability groups, failover cluster instances, log shipping and distributed AGs, with measured RPO and RTO.
Upgrades and migrations
Version upgrades, consolidation, Linux moves and Azure SQL migrations behind rehearsed, gated cutovers.
Remote DBA
Backups tested by restore, integrity checks, patching with cumulative updates, capacity and security reviews every month.
Architecture consulting
Design reviews and engine choices through SQL Server consulting, including when another engine fits better.
| Version | Build | Microsoft support status | Our SQL Server support position |
|---|---|---|---|
| SQL Server 2025 | 17.x | Current release | Supported; optimized locking and vector features evaluated per workload |
| SQL Server 2022 | 16.x | Mainstream support to 11 Jan 2028; extended to 11 Jan 2033 | Default target for most upgrades today |
| SQL Server 2019 | 15.x | Extended support to 8 Jan 2030 | Supported; plan the next upgrade window |
| SQL Server 2017 | 14.x | Extended support ends 12 Oct 2027 | Supported; upgrade planning should start now |
| SQL Server 2016 | 13.x | Extended support ended 14 Jul 2026 | Supported by us; upgrade or Extended Security Updates required for patches |
| Azure SQL Database and Managed Instance | evergreen | Managed by Microsoft | Supported; see our Azure data platform engineering page |
Dates follow the Microsoft lifecycle policy; we confirm the exact build and cumulative update on every estate before version-specific advice.
Plan stability
Query Store and plan regressions
The most common SQL Server support ticket we receive is a query that was fast yesterday. Query Store keeps every plan and its runtime statistics per interval, so SQL Server support can see exactly when the plan changed and what it cost, then force the good plan within minutes while the root cause is fixed properly.
Figure 2. A plan regression and its correction as Query Store records it. Durations are illustrative; the mechanism is documented in Monitoring performance by using the Query Store.
T-SQL · Query Store: queries with divergent plans, then force the good one
-- Query Store: queries with more than one plan where the slowest plan averages 3x the fastest (7 days)
WITH plan_stats AS (
SELECT p.query_id,
p.plan_id,
p.is_forced_plan,
SUM(rs.count_executions) AS execs,
SUM(rs.avg_duration * rs.count_executions)
/ NULLIF(SUM(rs.count_executions), 0) / 1000.0 AS avg_ms -- avg_duration is in µs
FROM sys.query_store_plan AS p
JOIN sys.query_store_runtime_stats AS rs ON rs.plan_id = p.plan_id
JOIN sys.query_store_runtime_stats_interval AS i ON i.runtime_stats_interval_id = rs.runtime_stats_interval_id
WHERE i.start_time >= DATEADD(DAY, -7, SYSUTCDATETIME())
GROUP BY p.query_id, p.plan_id, p.is_forced_plan
)
SELECT query_id,
COUNT(*) AS plans,
CAST(MIN(avg_ms) AS DECIMAL(12,2)) AS best_plan_ms,
CAST(MAX(avg_ms) AS DECIMAL(12,2)) AS worst_plan_ms,
SUM(execs) AS execs,
MAX(CASE WHEN is_forced_plan = 1 THEN plan_id END) AS forced_plan_id
FROM plan_stats
GROUP BY query_id
HAVING COUNT(*) > 1
AND MAX(avg_ms) > 3 * MIN(avg_ms)
ORDER BY (MAX(avg_ms) - MIN(avg_ms)) * SUM(execs) DESC;
-- Force the known-good plan; reversible with sys.sp_query_store_unforce_plan
EXEC sys.sp_query_store_force_plan @query_id = 1842, @plan_id = 41; -- illustrative IDs
Force, then fix
Forcing buys time; the lasting fix is a statistics, index or code change, after which the plan is unforced.
Parameter sensitivity
Parameter-sensitive plan optimization at compatibility level 160 and above keeps several plans for skewed parameters.
Query Store hints
Hints applied without code changes, useful for vendor applications we cannot modify.
Automatic tuning
FORCE_LAST_GOOD_PLAN enabled where the workload is stable enough for it to be safe.
SQL Server Support sizes Query Store storage and capture mode per database, so it stays in read-write mode during the incidents where it matters most.
Concurrency
Blocking, deadlocks and optimized locking in SQL Server 2025
Classic row locking holds every modified key lock until commit, so writers on different rows can still block one another during qualification, and large transactions escalate. SQL Server 2025 adds optimized locking: transaction ID locking and lock after qualification. SQL Server Support evaluates it per database, because it depends on accelerated database recovery and row versioning.
Figure 3. Two concurrent updates with and without optimized locking. Lock counts follow the optimized locking documentation.
Before enabling it, SQL Server support measures three things: the current LCK_M_* wait share, the version store growth that READ_COMMITTED_SNAPSHOT will add, and how the application behaves when reads stop blocking writes. Code that relies on blocking for correctness needs to be found first.
For estates on SQL Server 2019 or 2022, the same analysis drives the older remedies: shorter transactions, covering indexes that stop scans taking update locks, and RCSI where the application tolerates it. Deadlock graphs come from the system_health Extended Events session, which is on by default.
T-SQL · sqlcmd: enable optimized locking behind a confirmation gate
-- SQL Server 2025 (17.x): enable optimized locking on one database, inside a maintenance window
-- Run with: sqlcmd -v TargetDb="sales" ConfirmDb="sales" -i enable_optimized_locking.sql
-- 1. Verify before
SELECT name, is_accelerated_database_recovery_on, is_read_committed_snapshot_on, is_optimized_locking_on
FROM sys.databases
WHERE name = N'$(TargetDb)';
-- 2. Confirmation gate: a mismatch stops every statement below
IF N'$(ConfirmDb)' <> N'$(TargetDb)'
BEGIN
RAISERROR (N'Confirmation mismatch. No change made.', 16, 1);
SET NOEXEC ON;
END;
-- 3. Change: both SET options need exclusive access; ROLLBACK IMMEDIATE ends open transactions
ALTER DATABASE [$(TargetDb)] SET ACCELERATED_DATABASE_RECOVERY = ON WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [$(TargetDb)] SET READ_COMMITTED_SNAPSHOT = ON WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [$(TargetDb)] SET OPTIMIZED_LOCKING = ON;
-- 4. Validate after (expect 1, 1, 1), then compare LCK_M_* wait deltas with the baseline
SELECT name, is_accelerated_database_recovery_on, is_read_committed_snapshot_on, is_optimized_locking_on
FROM sys.databases
WHERE name = N'$(TargetDb)';
SET NOEXEC OFF;
High availability
Always On availability groups engineered for measured RPO and RTO
An availability group is only as good as its commit latency, its quorum and its last failover drill. SQL Server Support designs the replica layout from the recovery objectives, measures the synchronous commit cost in HADR_SYNC_COMMIT waits, and rehearses failover every quarter.
Figure 4. Replica layout and the synchronous commit path, as described in the Always On availability groups overview.
T-SQL · sqlcmd: verify, confirm, fail over, validate
-- Planned manual failover of an availability group (CLUSTER_TYPE = WSFC); run on the synchronous secondary
-- Run with: sqlcmd -v AgName="ag_prod" ConfirmAg="ag_prod" -i planned_failover.sql
-- Pacemaker (CLUSTER_TYPE = EXTERNAL) fails over through the cluster manager instead.
-- 1. Verify before: every database SYNCHRONIZED and HEALTHY, both queues near zero
SELECT ag.name AS ag_name,
ar.replica_server_name,
DB_NAME(drs.database_id) AS database_name,
drs.synchronization_state_desc,
drs.synchronization_health_desc,
drs.log_send_queue_size AS log_send_queue_kb,
drs.redo_queue_size AS redo_queue_kb
FROM sys.dm_hadr_database_replica_states AS drs
JOIN sys.availability_replicas AS ar ON ar.replica_id = drs.replica_id
JOIN sys.availability_groups AS ag ON ag.group_id = drs.group_id
WHERE ag.name = N'$(AgName)';
-- 2. Confirmation gate
IF N'$(ConfirmAg)' <> N'$(AgName)'
BEGIN
RAISERROR (N'Confirmation mismatch. No failover.', 16, 1);
SET NOEXEC ON;
END;
-- 3. Planned failover without data loss
ALTER AVAILABILITY GROUP [$(AgName)] FAILOVER;
-- 4. Validate after: this replica reports PRIMARY, the former primary rejoins as SECONDARY
SELECT ar.replica_server_name, ars.role_desc, ars.synchronization_health_desc
FROM sys.dm_hadr_availability_replica_states AS ars
JOIN sys.availability_replicas AS ar ON ar.replica_id = ars.replica_id;
SET NOEXEC OFF;
| Objective | Design we use | How we prove it |
|---|---|---|
| RPO 0 in region | Synchronous secondary, automatic failover | Synchronized state, commit latency trend |
| RPO minutes across regions | Asynchronous replica or distributed AG | Log send queue divided by send rate |
| Low RTO for the application | Listener, MultiSubnetFailover, retry logic | Client-side reconnect time in drills |
| Instance-level objects follow failover | Contained availability groups (2022+) | Logins and Agent jobs present after failover |
| Low-cost warm standby | Log shipping | Restore lag and restore test results |
Every SQL Server support HA design ships with a failover runbook: verification before, a confirmation gate, the change, and validation after, as in the script alongside.
Configuration
Memory, parallelism, tempdb and storage
Defaults suit a laptop, not a production server. SQL Server Support changes configuration only from measured evidence, and records every change with its current value, proposed value, unit and whether it needs a restart.
| Setting | Current | Proposed | Unit | Apply |
|---|---|---|---|---|
max server memory |
2147483647 | 115000 | MB | RECONFIGURE, no restart |
max degree of parallelism |
0 | 8 | schedulers | RECONFIGURE, no restart |
cost threshold for parallelism |
5 | 50 | cost units | RECONFIGURE, no restart |
| tempdb data files | 1 | 8, equal size | files | adding files, no restart |
| memory-optimized tempdb metadata | OFF | ON | switch | restart required |
Values are illustrative for a 128 GB, 16-core host. Real values come from memory clerks, wait deltas and file latency on your server, and every change is tested in non-production first.
T-SQL · average I/O latency per database file
-- Average I/O latency per database file (since startup; snapshot twice for an incident window)
SELECT DB_NAME(vfs.database_id) AS database_name,
mf.type_desc,
mf.physical_name,
vfs.num_of_reads,
vfs.num_of_writes,
CAST(vfs.io_stall_read_ms * 1.0 / NULLIF(vfs.num_of_reads, 0) AS DECIMAL(10,2)) AS avg_read_ms,
CAST(vfs.io_stall_write_ms * 1.0 / NULLIF(vfs.num_of_writes, 0) AS DECIMAL(10,2)) AS avg_write_ms
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs
JOIN sys.master_files AS mf
ON mf.database_id = vfs.database_id
AND mf.file_id = vfs.file_id
ORDER BY vfs.io_stall_read_ms + vfs.io_stall_write_ms DESC;
In SQL Server support work, log files with write latency far above the storage tier’s expectation explain WRITELOG; data files with high read latency explain PAGEIOLATCH. SQL Server Support takes both to the storage team with numbers attached.
Upgrades and migration
Upgrades without optimizer surprises
An upgrade changes two things at once: the engine and, if you let it, the optimizer’s behaviour through the compatibility level. SQL Server Support separates them. The engine moves first behind a rehearsed cutover; the compatibility level rises later, measured against a Query Store baseline.
Figure 5. Source, method, target and the compatibility level protocol SQL Server support follows; support dates as published by Microsoft.
Rolling AG upgrade
Add or upgrade a secondary on the new version, fail over, then upgrade the former primary. Downtime is one failover.
Azure SQL Managed Instance
The Managed Instance link replicates continuously, so cutover is a planned failover with a tested way back.
Off SQL Server entirely
Where licensing cost outweighs the features used, we assess a move to PostgreSQL with our PostgreSQL consulting team, and say plainly when it does not pay off.
Security and compliance
Security controls mapped to evidence
Auditors ask for proof, not configuration screenshots. SQL Server Support maps each obligation to an engine control and the query or report that shows it is in force.
| Obligation | SQL Server control | Version | Evidence |
|---|---|---|---|
| Encryption at rest | Transparent data encryption | Standard edition since 2019 | sys.dm_database_encryption_keys |
| Sensitive columns | Always Encrypted, with secure enclaves | Enclaves since 2019 | Column master and encryption key inventory |
| Tamper evidence | Ledger tables | 2022+ | Ledger digest verification |
| Encryption in transit | TDS 8.0 strict encryption, TLS 1.3 | 2022+ | Connection encryption state per session |
| Identity | Microsoft Entra authentication | 2022+ (via Azure Arc) | Server principals by type |
| Audit trail | SQL Server Audit | All supported versions | Audit specifications and log review |
Test every security, configuration, locking and failover change in non-production first, keep backups verified by regular restore tests, and maintain a robust disaster-recovery posture with a rehearsed secondary site.
Engagement
How SQL Server support engagements run
Most engagements start with a health check that ranks findings by risk and effort, then continue as ongoing support or remote DBA. Emergencies come in through the same door, 24×7.
Start
Health check
Waits, Query Store, configuration, HA, backups and security, ranked with evidence.
Ongoing
24×7 support
SQL Server Support under SLA with named engineers who know your estate.
FAQ
SQL Server Support FAQ
Answers to the questions teams ask before starting SQL Server support with MinervaDB.
Which SQL Server versions do you support?
Our SQL Server support covers SQL Server 2016 through 2025 on Windows and Linux, plus Azure SQL Database and Managed Instance. SQL Server 2016 left extended support on 14 July 2026, so we also plan upgrades or Extended Security Updates for those estates.
How fast do you respond to a production outage?
Under SQL Server support contracts, Severity 1 incidents receive a response within 15 minutes, 24×7×365. Severity 2 is 12 hours, Severity 3 is 24 hours and Severity 4 is 48 hours.
A query was fast yesterday and slow today. What do you do first?
We check Query Store for a plan change on that query, force the last good plan if the regression is confirmed, and then fix the cause, usually statistics, an index or parameter sensitivity, before removing the forced plan.
Should we enable optimized locking on SQL Server 2025?
Often, but not blindly. It requires accelerated database recovery and works best with read committed snapshot isolation, which changes how reads and writes interact. We measure lock waits and version store impact on a copy of the workload first.
Can you design and test our Always On availability groups?
Yes. We design replicas and quorum from your RPO and RTO, measure synchronous commit cost, and run quarterly failover drills with a written runbook and validation after every failover.
How do you upgrade without breaking query performance?
We move the engine first while keeping the old compatibility level, capture a Query Store baseline, then raise the compatibility level and correct any regressions per query.
Do you work alongside our in-house DBAs?
Yes. Most SQL Server support engagements complement an internal team, covering nights, weekends, escalations and specialist work such as HA design or upgrades.
Will you tell us if SQL Server is the wrong choice?
Yes. MinervaDB is vendor-neutral. When a workload would be cheaper or simpler on PostgreSQL or another engine, we say so with a cost and risk comparison before any migration is proposed.
Put senior SQL Server engineers on call for your estate
Start with a health check that ranks waits, plan risks, HA gaps and security findings by impact. SQL Server Support for active incidents is available through the same page, 24×7.