Free technical resources
Database engineering blog
Concise field notes on query tuning, reliability, migration, backup, and operations.
Security & recovery · 2026-10-04Database 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-01Always 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-28SQL 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.
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-23AI-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.
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.
Finding used and unused indexes before you drop anything
Pair seek/scan usage with write cost before marking an index unused.
Index maintenance that fits the maintenance window
Prefer targeted reorganize over nightly rebuild-everything jobs.
Reading index fragmentation without chasing ghosts
Fragmentation only matters when scans or range seeks read many pages.
Spotting duplicate and near-duplicate indexes
Drop the redundant cover once you prove the survivor serves the same predicates.
Catching regressed queries with Query Store
Sort by duration delta, then confirm the plan_id that actually changed.
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 rewrites that beat hint stacking
A clearer shape usually beats a forced join order on the old mess.
Always On is a 22-phase build, not a checkbox
Treat AG/WSFC as gated phases — infrastructure first, failover proof last.
Compat 160 is slow after a 2016 to 2022 restore
Keep CL 130, baseline with Query Store, then fix CE regressions before cutover.
Breaking complex logic with CTEs and temp tables
Use CTEs for clarity; materialize with temp tables when estimates go wild.
A production SQL Server install checklist that survives audits
Install once against a checklist so day-two ops is boring.
SQL Server stored procedures vs inline SQL
The real fight is disciplined parameterized SQL versus undisciplined string-built queries — not SP versus inline.
Table variables for small, known rowsets
Table variables shine for small fixed lists; skip them for large unknown sets.
Assessment reports should drive tickets
Turn findings into prioritized, assignable work.
Backup verification beats backup theater
Prove restore SLAs with scheduled verification, not just successful backup jobs.
EXISTS and CROSS APPLY instead of LEFT JOIN for existence checks
Prefer EXISTS for filters; CROSS APPLY for correlated top-N lookups.
Observability for DBAs is still SQL-shaped
Bridge app traces with database wait and plan evidence.
Using IIF for simple conditional expressions
IIF is fine for short true/false expressions; keep complex branching in CASE.
Schema drift is a reliability problem
Treat schema compare as a release gate, not a quarterly cleanup chore.
Alert fatigue destroys on-call trust
Prefer actionable alerts with clear ownership and runbooks.
Reading wait stats without drowning in noise
Focus on runnable waits that explain user-visible latency.
Cutover checklists for engine migrations
Baseline, rehearse, verify, then cut — in that order.
Postgres vacuum debt compounds quietly
Watch freeze age and dead tuples before users feel the pain.
Monitor before you migrate
Baseline latency and top queries before any engine cutover.
Parameter sniffing triage in five minutes
Confirm sniffed values before rewriting every procedure.
Blocking chains beat single-query blame
Always capture the head blocker when waits spike.
Autogrowth events are silent outages
Watch growth frequency and size before users report timeouts.
Buffer cache hit ratio is not a silver bullet
Pair cache metrics with latency and IO stall evidence.