The heap or clustered index choice changes the reads of every scan. The demos measure forwarded records in a heap, a range query on both kinds of table, and the size of a nonclustered index on a wide key, and says when a heap is the right choice.
One Default Row per Customer With a Filtered Unique Index
Two browser tabs, two default addresses. Here is how a filtered unique index keeps the rule in the database and how to switch defaults safely.
SQL SERVER – Measure Index Performance
I measure index performance against the same workload before and after a change. A customer wanted to assess a new index.
Count Rows in a Heap: Which Scan Does SQL Server Use?
Count rows in a heap and SQL Server scans every page. See the plan change with a clustered and a narrow index, and why a heap does not compact its pages.
Index Used for COUNT(*): SQL Server Scans the Narrowest One
The index used for COUNT(*) is the narrowest one that holds every row. See the pages, the scans and the reads that prove it in SQL Server.
Number of Rows Read in an Execution Plan: What It Tells You
The number of rows read shows how many rows a scan or seek touched, and it can be far larger than the rows it returned. This post builds a demo table, compares a scan with two seeks, and explains why a seek can still read too many rows.
Uniquifier: The Hidden Cost of Duplicate Clustered Keys
The uniquifier is a hidden 4-byte value that SQL Server adds to duplicate keys in a non-unique clustered index. This post measures its real cost row by row on SQL Server 2025 and shows it on the page. It also compares it with a unique key you choose yourself.







