Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
SQL

SQL Queries Randomly Slow Down

- 02.01.26 | 03.01.26 - ErcanOPAK

Same query, different speed.

Why
Parameter sniffing.

Fix
Use OPTION (RECOMPILE) selectively.


🐌 Same Query, Different Speed

Nothing changed. Except the parameters.

If a query sometimes runs in 10 ms and sometimes in 10 seconds,
you’re probably not looking at a missing index.

You’re looking at parameter sniffing.


🚨 The Core Problem

SQL Server creates an execution plan based on the first parameter values it sees.

That plan is then cached and reused — even if future parameters behave very differently.

✔ Great for performance
❌ Terrible for uneven data distribution


💥 A Real-World Example

SELECT *
FROM Orders
WHERE CustomerId = @CustomerId

First execution

@CustomerId = 1   -- returns 5 rows

SQL Server chooses:

  • Nested loops

  • Index seek

  • “Small result set” plan

Next execution

@CustomerId = 9999  -- returns 500,000 rows

❌ Same plan
❌ Massive scan
❌ Query crawls

Same query.
Same indexes.
Different speed.


❌ Why This Happens

  • Execution plan is compiled once

  • First parameter “sniffs” the plan

  • Cached plan reused blindly

  • Data skew breaks assumptions

SQL Server isn’t wrong — it’s over-confident.


🛠 The Fix: OPTION (RECOMPILE)

SELECT *
FROM Orders
WHERE CustomerId = @CustomerId
OPTION (RECOMPILE);

This forces SQL Server to:

  • Recompile the plan

  • Use current parameter values

  • Generate the optimal plan each time


⚠️ Use It Selectively

Recompiling is not free.

✔ Perfect for:

  • Highly variable parameters

  • Large data skew

  • Rare but critical queries

❌ Avoid on:

  • High-frequency queries

  • Simple lookups

  • OLTP hot paths


🧠 Alternative Strategies

  • Local variables (sometimes)

  • Dynamic SQL

  • OPTIMIZE FOR hint

  • Query splitting

But when in doubt:
Selective recompile beats unpredictable performance.


🧾 TL;DR

❌ Same query ≠ same speed
❌ Cached plan ≠ optimal plan

✅ Parameter sniffing is the culprit
✅ OPTION (RECOMPILE) fixes it
✅ Use it carefully


SQL Server didn’t slow down.
It just trusted the wrong first impression.

Related posts:

SQL: Use HAVING to Filter Aggregated Results

Indexing Superpowers: The 5 Index Types Every Dev Should Know

How to find repetitive records and keep only 1 record for uniqueness in SQL

Post Views: 12

Post navigation

Middleware Order Breaks Security
SQL Index Exists but Not Used

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

April 2026
M T W T F S S
 12345
6789101112
13141516171819
20212223242526
27282930  
« Mar    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (950)
  • How to add default value for Entity Framework migrations for DateTime and Bool (858)
  • Get the First and Last Word from a String or Sentence in SQL (836)
  • How to select distinct rows in a datatable in C# (805)
  • How to make theater mode the default for Youtube (754)
  • Add Constraint to SQL Table to ensure email contains @ (578)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (564)
  • Average of all values in a column that are not zero in SQL (531)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (489)
  • Find numbers with more than two decimal places in SQL (447)

Recent Posts

  • C#: Use Init-Only Setters for Immutable Objects After Construction
  • C#: Use Expression-Bodied Members for Concise Single-Line Methods
  • C#: Enable Nullable Reference Types to Eliminate Null Reference Exceptions
  • C#: Use Record Types for Immutable Data Objects
  • SQL: Use CTEs for Readable Complex Queries
  • SQL: Use Window Functions for Advanced Analytical Queries
  • .NET Core: Use Background Services for Long-Running Tasks
  • .NET Core: Use Minimal APIs for Lightweight HTTP Services
  • Git: Use Cherry-Pick to Apply Specific Commits Across Branches
  • Git: Use Interactive Rebase to Clean Up Commit History Before Merge

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (950)
  • How to add default value for Entity Framework migrations for DateTime and Bool (858)
  • Get the First and Last Word from a String or Sentence in SQL (836)
  • How to select distinct rows in a datatable in C# (805)
  • How to make theater mode the default for Youtube (754)

Recent Posts

  • C#: Use Init-Only Setters for Immutable Objects After Construction
  • C#: Use Expression-Bodied Members for Concise Single-Line Methods
  • C#: Enable Nullable Reference Types to Eliminate Null Reference Exceptions
  • C#: Use Record Types for Immutable Data Objects
  • SQL: Use CTEs for Readable Complex Queries

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com