I am a heading
Thanks for watching! Demo scripts below.
Demo Scripts
USE StackOverflow2013; EXEC dbo.DropIndexes; SET NOCOUNT ON; DBCC FREEPROCCACHE; GO CREATE INDEX chunk ON dbo.Posts (OwnerUserId, Score DESC) INCLUDE (CreationDate, LastActivityDate) WITH (MAXDOP = 8, SORT_IN_TEMPDB = ON, DATA_COMPRESSION = PAGE); GO CREATE OR ALTER VIEW dbo.PushyPaul WITH SCHEMABINDING AS SELECT p.OwnerUserId, p.Score, p.CreationDate, p.LastActivityDate, PostRank = DENSE_RANK() OVER ( PARTITION BY p.OwnerUserId ORDER BY p.Score DESC ) FROM dbo.Posts AS p; GO SELECT p.* FROM dbo.PushyPaul AS p WHERE p.OwnerUserId = 22656; GO CREATE OR ALTER PROCEDURE dbo.StinkyPete ( @UserId int ) AS SET NOCOUNT, XACT_ABORT ON; BEGIN SELECT p.* FROM dbo.PushyPaul AS p WHERE p.OwnerUserId = @UserId; END; GO EXEC dbo.StinkyPete @UserId = 22656; /*Start Here*/ ALTER DATABASE StackOverflow2013 SET PARAMETERIZATION SIMPLE; DBCC TRACEOFF ( 4199, -1 ); ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = OFF; SELECT p.* FROM dbo.PushyPaul AS p WHERE p.OwnerUserId = 22656 AND 1 = (SELECT 1); /*Avoid trivial plan/simple parameterization*/ /*Let's cause a problem!*/ ALTER DATABASE StackOverflow2013 SET PARAMETERIZATION FORCED; SELECT p.* FROM dbo.PushyPaul AS p WHERE p.OwnerUserId = 22656 AND 1 = (SELECT 1); /*Avoid trivial plan/simple parameterization*/ /*Can we fix the problem?*/ DBCC TRACEON ( 4199, -1 ); SELECT p.* FROM dbo.PushyPaul AS p WHERE p.OwnerUserId = 22656 AND 1 = (SELECT 1); /*Avoid trivial plan/simple parameterization*/ /*That's kinda weird...*/ DBCC FREEPROCCACHE; SELECT p.* FROM dbo.PushyPaul AS p WHERE p.OwnerUserId = 22656 AND 1 = (SELECT 1); /*Avoid trivial plan/simple parameterization*/ /*Turn Down Service*/ DBCC TRACEOFF ( 4199, -1 ); SELECT p.* FROM dbo.PushyPaul AS p WHERE p.OwnerUserId = 22656 AND 1 = (SELECT 1); /*Avoid trivial plan/simple parameterization*/ /*Okay then.*/ /*I'm different.*/ ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = ON; SELECT p.* FROM dbo.PushyPaul AS p WHERE p.OwnerUserId = 22656 AND 1 = (SELECT 1); /*Avoid trivial plan/simple parameterization*/ /*Cleanup*/ ALTER DATABASE StackOverflow2013 SET PARAMETERIZATION SIMPLE; ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = OFF; DBCC TRACEOFF ( 4199, -1 );
Going Further
If this is the kind of SQL Server stuff you love learning about, you’ll love my training. I’m offering a 75% discount to my blog readers if you click from here. I’m also available for consulting if you just don’t have time for that and need to solve performance problems quickly.