Free technical resources

Database engineering blog

Concise field notes on query tuning, reliability, migration, backup, and operations.

Security & recovery · 2026-10-04

Database attack surface defense

A practical guide for DBAs, application owners, and security teams on common attack paths, control limits, detection signals, and recovery drills.

Security & recovery · 2026-10-01

Always Encrypted in SQL Server: a practical guide

A plain-English, diagram-led guide to Always Encrypted with validated SQL, PowerShell, and C# examples.

Security & recovery · 2026-09-28

SQL Server ransomware defense: hardening, detection, and recoverable backups

Reduce SQL Server ransomware risk with concrete hardening priorities, detection sources, isolated backups, and a restore process the business can trust.

Performance · 2026-09-27

SQL Server Wait Statistics Troubleshooting Guide

A hands-on workflow for collecting and interpreting SQL Server wait statistics without treating one wait type as an automatic diagnosis.

AI and SQL · 2026-09-23

AI-Assisted SQL Development — From Prompting to Proof

Choose the right AI surface, write evidence-rich prompts, constrain agent behavior, and prove every SQL rewrite with plans, metrics, and result checks.

SQL Server · 2026-09-07

In-Memory OLTP on SQL Server 2025 — create, use, and fully undeploy

Run the two-part SQL Server 2025 lab, interpret XTP memory and undeploy status, and safely remove the final memory-optimized container.

Index · 2026-08-10

Finding used and unused indexes before you drop anything

Pair seek/scan usage with write cost before marking an index unused.

Index · 2026-08-09

Index maintenance that fits the maintenance window

Prefer targeted reorganize over nightly rebuild-everything jobs.

Index · 2026-08-08

Reading index fragmentation without chasing ghosts

Fragmentation only matters when scans or range seeks read many pages.

Index · 2026-08-07

Spotting duplicate and near-duplicate indexes

Drop the redundant cover once you prove the survivor serves the same predicates.

Query Store · 2026-08-06

Catching regressed queries with Query Store

Sort by duration delta, then confirm the plan_id that actually changed.

Query Store · 2026-08-05

When (and when not) to force a plan in Query Store

Force only after you can name the regression trigger and a review date.

Query Tuning · 2026-08-04

Query rewrites that beat hint stacking

A clearer shape usually beats a forced join order on the old mess.

blog · 2026-08-03

Always On is a 22-phase build, not a checkbox

Treat AG/WSFC as gated phases — infrastructure first, failover proof last.

blog · 2026-08-03

Compat 160 is slow after a 2016 to 2022 restore

Keep CL 130, baseline with Query Store, then fix CE regressions before cutover.

Query Tuning · 2026-08-03

Breaking complex logic with CTEs and temp tables

Use CTEs for clarity; materialize with temp tables when estimates go wild.

blog · 2026-08-03

A production SQL Server install checklist that survives audits

Install once against a checklist so day-two ops is boring.

blog · 2026-08-03

SQL Server stored procedures vs inline SQL

The real fight is disciplined parameterized SQL versus undisciplined string-built queries — not SP versus inline.

Query Tuning · 2026-08-02

Table variables for small, known rowsets

Table variables shine for small fixed lists; skip them for large unknown sets.

blog · 2026-08-01

Assessment reports should drive tickets

Turn findings into prioritized, assignable work.

blog · 2026-08-01

Backup verification beats backup theater

Prove restore SLAs with scheduled verification, not just successful backup jobs.

Query Tuning · 2026-08-01

EXISTS and CROSS APPLY instead of LEFT JOIN for existence checks

Prefer EXISTS for filters; CROSS APPLY for correlated top-N lookups.

blog · 2026-08-01

Observability for DBAs is still SQL-shaped

Bridge app traces with database wait and plan evidence.

Query Tuning · 2026-07-31

Using IIF for simple conditional expressions

IIF is fine for short true/false expressions; keep complex branching in CASE.

blog · 2026-07-30

Schema drift is a reliability problem

Treat schema compare as a release gate, not a quarterly cleanup chore.

blog · 2026-07-29

Alert fatigue destroys on-call trust

Prefer actionable alerts with clear ownership and runbooks.

blog · 2026-07-28

Reading wait stats without drowning in noise

Focus on runnable waits that explain user-visible latency.

blog · 2026-07-26

Cutover checklists for engine migrations

Baseline, rehearse, verify, then cut — in that order.

blog · 2026-07-22

Postgres vacuum debt compounds quietly

Watch freeze age and dead tuples before users feel the pain.

blog · 2026-07-20

Monitor before you migrate

Baseline latency and top queries before any engine cutover.

blog · 2026-07-16

Parameter sniffing triage in five minutes

Confirm sniffed values before rewriting every procedure.

blog · 2026-07-14

Blocking chains beat single-query blame

Always capture the head blocker when waits spike.

blog · 2026-07-08

Autogrowth events are silent outages

Watch growth frequency and size before users report timeouts.

blog · 2026-07-05

Buffer cache hit ratio is not a silver bullet

Pair cache metrics with latency and IO stall evidence.