What is parameter sniffing in SQL, and how do you resolve performance issues caused by it?
Muhammad Imran Ansari
Parameter Sniffing is a behavior in SQL Server and other database engines where a stored procedure or query caches an execution plan based on the first set of parameter values it receives. This cached plan is then used for subsequent executions, regardless of whether the new parameter values are optimal for that plan.
How Does Parameter Sniffing Work?
How to Fix Parameter Sniffing Issues?
OPTION (RECOMPILE): Forces a new execution plan for every execution.
SELECT * FROM Orders WHERE CustomerID = @CustomerID OPTION (RECOMPILE)
OPTIMIZE FOR UNKNOWN: Ignores the specific parameter value and generates a generic plan.
SELECT * FROM Orders WHERE CustomerID = @CustomerID OPTION (OPTIMIZE FOR UNKNOWN)
Assign the parameter to a local variable inside the procedure to prevent SQL Server from using a parameter-specific plan.
CREATE PROCEDURE GetOrdersByCustomer @CustomerID INT AS BEGIN DECLARE @LocalCustomerID INT = @CustomerID SELECT * FROM Orders WHERE CustomerID = @LocalCustomerID END
CREATE PROCEDURE GetOrdersByCustomer @CustomerID INT
AS
BEGIN
DECLARE @LocalCustomerID INT = @CustomerID
SELECT * FROM Orders WHERE CustomerID = @LocalCustomerID
END
Use if-else logic to handle different cases separately.
IF @CustomerID < 100 SELECT * FROM Orders WHERE CustomerID = @CustomerID OPTION (RECOMPILE) ELSE SELECT * FROM Orders WHERE CustomerID = @CustomerID
IF @CustomerID < 100
ELSE
SELECT * FROM Orders WHERE CustomerID = @CustomerID
If needed, clear the stored plan using:
DBCC FREEPROCCACHE