Check Top Logical Reads Queries in 45 Seconds. From Symptoms to Root Clause. The "45 Seconds DBA Series" – What Real DBAs Check First | Part 8 🥇"

Before we dive into today's topic, if you missed my previous post you can take a look at SQL Server Management Studio 22.5.2 NEWS!.
👉 If you found this deep-dive helpful, feel free to check out the ads—your support helps me keep creating high-quality SQL Server
content for the community.

If CPU usage is just the smoke, Logical Reads are the fire. In this post, I’ll show you how to identify the I/O-heavy queries that are silently starving your Buffer Pool and killing your Page Life Expectancy in under 45 seconds.

✔️ Memory Churn: High logical reads mean your queries are scanning massive amounts of data in the Buffer Pool. 🛠️
✔️ The 8KB Rule: Every logical read is an 8KB page access; 1 million reads equals roughly 7.6GB of data processed in memory. 📦
✔️ Plan Cache Mining: We use sys.dm_exec_query_stats to find the heaviest I/O hitters without the overhead of Extended Events. 🚀
✔️ Surgical Fixes: Moving from an Index Scan to an Index Seek can reduce logical reads from thousands to single digits. ✔️

Hi SQL SERVER Guys,

While most DBAs obsess over CPU spikes, the veterans look at Logical Reads. Why? Because high logical reads are the primary driver of high CPU and memory pressure. If your queries are forcing SQL Server to traverse millions of pages just to return ten rows, you aren't dealing with a hardware bottleneck—you're dealing with a design flaw. Let's find the truth in 45 seconds...

What It Really Is: Memory-Based I/O

A Logical Read occurs every time SQL Server fetches a page from the Buffer Pool (memory). If the page isn't in memory, it performs a Physical Read to bring it in.

💣 The Problem: Even if your data is "all in RAM," logical reads are not free. Each read requires a CPU cycle and a memory bus operation. High logical reads lead to "Buffer Cache Hit Ratio" illusions—you might have a 99% hit ratio, but your Page Life Expectancy (PLE) is tanking because a single poorly written query is flushing the cache repeatedly.

  • Total vs. Average: A query running once with 1 million reads is bad, but a query running 10,000 times with 5,000 reads is a server-killer.

  • Plan Cache DMVs: These provide a historical view of what has been running since the last service restart.

🧪 The 45-Second Investigation Script

Run this query to immediately see the top 10 queries causing the most memory pressure on your system:

SELECT TOP 10
    SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
    ((CASE statement_end_offset 
        WHEN -1 THEN DATALENGTH(st.text) 
        ELSE qs.statement_end_offset END 
            - qs.statement_start_offset)/2) + 1) AS [Query Text],
    qs.execution_count,
    [Avg Logical Reads] = qs.total_logical_reads / qs.execution_count,
    [Total Logical Reads] = qs.total_logical_reads,
    qs.total_worker_time / 1000 AS [Total CPU ms],
    qp.query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
ORDER BY qs.total_logical_reads DESC;

*Refer to the official Microsoft documentation for deep details on sys.dm_exec_query_stats metrics.

🚀 My REAL Strategy

During years of experience, I’ve found that 80% of high logical reads come from residual predicates. This is when SQL Server seeks to a point in an index but then has to read (scan) thousands of extra pages because the subsequent filters aren't part of the index.

  • Check for Scans: If your logical reads are high, look at the execution plan for "Index Scan" or "Table Scan". A scan of a 1GB table will always result in ~128,000 logical reads.
  • Look for Key Lookups: If a query has high logical reads but the execution plan shows a Seek, check for a Key Lookup. This is a common performance killer where SQL has to jump back to the clustered index for every single row.
  • SARGability is King: Functions on columns in the WHERE clause (e.g., WHERE LEFT(LastName, 1) = 'B') prevent index seeks and explode your logical read counts.

📢 Support the Blog: Did you find this deep-dive helpful? The ads you see here are selected to reflect your interests. If a partner's offer catches your eye, give it a look! Your engagement helps me continue publishing premium SQL Server content for the community.

Biondi Luca @2026 - Sharing over 25 years of Gained Knowledge for Passion. Share if you like my posts!

Comments

I Post più popolari

Speaking to Sql Server, sniffing the TDS protocol

SQL Server, find text in a Trigger, Stored Procedures, View and Function. Two ways and what ways is better

SQL Server, Avoid that damn Table Spool!