DevOps
The Migration That Locked the Table for Eleven Minutes
The column was added with a default that required a full table rewrite, so the table took an exclusive lock and every write queued behind it until the…
Query plans, lock contention, deadlocks and the row estimate errors behind most reports that an index is not being used.
DevOps
The column was added with a default that required a full table rewrite, so the table took an exclusive lock and every write queued behind it until the…
Bug Hunt
The collation differed between the containers, so the same query returned the rows in a different order, and the pagination showed duplicates and gaps…
Deep Dive
The index was built and the query still scanned the table, because the predicate wrapped the column in a function, and the wrapped column is not the value…
Performance
The page query read and discarded ninety thousand rows to return the twenty on page four thousand, and the cost grew with the page number rather than the…
Tooling
The plan output looked like noise until the nested loops were read as a route and the row estimate gap pointed straight at the missing statistic, and the…
Error Autopsy
A connection checked out from the pool was never committed, so the transaction sat idle holding a row lock, and everything behind it queued until the pool…
Tooling
The extension records every query's call count, total time and rows, normalised by shape, and the slow query you chase for a week is one aggregation away…
Error Autopsy
The rotation generated a strong password with an at sign in it, and the connection string, parsed as a URL, read the at sign as the user host separator, and…
Deep Dive
The commit returns before the data is on the platter, and the gap between the log write and the flush is where durability lives, and where one setting…
Deep Dive
Latency was fine, then terrible, then fine, on a rhythm of a few minutes, with no traffic rhythm to match. The period was the checkpoint interval, and the…
DevOps
The primary died and the replica took over in seconds, which is what the dashboard promised. The last three hours of writes were not there, because the…
Performance
Nothing about the query changed. The table crossed the size where the planner stops choosing the index and starts scanning, because the working set stopped…