From 6c05bd89c98af6daac791170cbf14b245dfc548f Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Thu, 15 Sep 2016 16:03:48 -0700 Subject: [PATCH] Add files via upload --- .../demos/mssqltiger/xEvents/HashWarning.sql | 68 ++++++++++++++++++ .../mssqltiger/xEvents/MemoryGrant_XE.sql | 38 ++++++++++ .../xEvents/MemoryGrant_XE_Setup.sql | 71 +++++++++++++++++++ .../mssqltiger/xEvents/PerfStats_XE_Demo.sql | 42 +++++++++++ .../demos/mssqltiger/xEvents/SortWarning.sql | 33 +++++++++ 5 files changed, 252 insertions(+) create mode 100644 samples/demos/mssqltiger/xEvents/HashWarning.sql create mode 100644 samples/demos/mssqltiger/xEvents/MemoryGrant_XE.sql create mode 100644 samples/demos/mssqltiger/xEvents/MemoryGrant_XE_Setup.sql create mode 100644 samples/demos/mssqltiger/xEvents/PerfStats_XE_Demo.sql create mode 100644 samples/demos/mssqltiger/xEvents/SortWarning.sql diff --git a/samples/demos/mssqltiger/xEvents/HashWarning.sql b/samples/demos/mssqltiger/xEvents/HashWarning.sql new file mode 100644 index 00000000..44744d99 --- /dev/null +++ b/samples/demos/mssqltiger/xEvents/HashWarning.sql @@ -0,0 +1,68 @@ +-- Param Sniffing with Hash Spill + +-- Setup +--USE AdventureWorks2014 +USE AdventureWorks2016CTP3 +GO +DROP TABLE CustomersState +GO +CREATE TABLE CustomersState (CustomerID int PRIMARY KEY, [Address] CHAR(200), [State] CHAR(2)) +GO +INSERT INTO CustomersState (CustomerID, [Address]) +SELECT CustomerID, 'Address' FROM Sales.Customer +GO +UPDATE CustomersState SET [State] = 'NY' WHERE CustomerID % 100 <> 1 +UPDATE CustomersState SET [State] = 'WA' WHERE CustomerID % 100 = 1 +GO + +UPDATE STATISTICS CustomersState WITH FULLSCAN +GO + +CREATE PROCEDURE CustomersByState @State CHAR(2) AS +BEGIN + DECLARE @CustomerID int + SELECT @CustomerID = e.CustomerID FROM Sales.Customer e + INNER JOIN CustomersState es ON e.CustomerID = es.CustomerID + WHERE es.[State] = @State + OPTION (MAXDOP 1) +END +GO + + +-- Create xEvent session +DROP EVENT SESSION [HashSpills] ON SERVER +GO +CREATE EVENT SESSION [HashSpills] ON SERVER +ADD EVENT sqlserver.hash_spill_details( + ACTION(sqlserver.database_name,sqlserver.is_system,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_nt_username,sqlserver.sql_text)), +ADD EVENT sqlserver.hash_warning( + ACTION(sqlserver.database_name,sqlserver.is_system,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_nt_username,sqlserver.sql_text)) +--ADD TARGET package0.ring_buffer(SET max_memory=(25600)) +ADD TARGET package0.event_file(SET filename=N'C:\IP\Tiger\TR23\Demos\Demo 1.1 - Spills\HashSpills.xel',max_file_size=(50),max_rollover_files=(2)) +WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) +GO + +--Execute the stored procedure first with parameter value ‘WA’ – which will select 1% of data. +DBCC FREEPROCCACHE +GO +ALTER EVENT SESSION [HashSpills] ON SERVER STATE = START +GO +EXEC CustomersByState 'WA' +GO + +EXEC CustomersByState 'NY' +GO +ALTER EVENT SESSION [HashSpills] ON SERVER STATE = STOP +GO + +/* +Observe the type of Spill = Recursion +Occurs when the build input does not fit into available memory, +resulting in the split of input into multiple partitions that are processed separately. + +If any of these partitions still do not fit into available memory, +it is split into sub-partitions, which are also processed separately. +This splitting process continues until each partition fits into available memory +or until the maximum recursion level is reached. +In this case it stopped at level 1. +*/ \ No newline at end of file diff --git a/samples/demos/mssqltiger/xEvents/MemoryGrant_XE.sql b/samples/demos/mssqltiger/xEvents/MemoryGrant_XE.sql new file mode 100644 index 00000000..74712515 --- /dev/null +++ b/samples/demos/mssqltiger/xEvents/MemoryGrant_XE.sql @@ -0,0 +1,38 @@ +-- Mem Grant xEvents + +-- Added MIN_GRANT_PERCENT for repro on SQL 2014 SP2 and 2016 only, because fix for this scenario is in those releases. + +-- Create xEvent session in 2016 +-- Detect inaccurate or insufficient memory grant, when grant is >5MB as minimum +DROP EVENT SESSION [MemoryGrantXE] ON SERVER +GO +CREATE EVENT SESSION [MemoryGrantXE] ON SERVER +/* +ADD EVENT sqlserver.query_memory_grant_blocking( + ACTION(sqlserver.database_name,sqlserver.is_system,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_hash_signed,sqlserver.query_plan_hash,sqlserver.query_plan_hash_signed,sqlserver.session_nt_username,sqlserver.sql_text)), +ADD EVENT sqlserver.query_memory_grant_resource_semaphores( + ACTION(sqlserver.database_name,sqlserver.is_system,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_hash_signed,sqlserver.query_plan_hash,sqlserver.query_plan_hash_signed,sqlserver.session_nt_username,sqlserver.sql_text)), +ADD EVENT sqlserver.query_memory_grants( + ACTION(sqlserver.database_name,sqlserver.is_system,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_hash_signed,sqlserver.query_plan_hash,sqlserver.query_plan_hash_signed,sqlserver.session_nt_username,sqlserver.sql_text)), +*/ +ADD EVENT sqlserver.query_memory_grant_usage( + ACTION(sqlserver.database_name,sqlserver.is_system,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_hash_signed,sqlserver.query_plan_hash,sqlserver.query_plan_hash_signed,sqlserver.session_nt_username,sqlserver.sql_text)) +ADD TARGET package0.event_file(SET filename=N'C:\IP\Tiger\TR23\Demos\Demo 1.2 - Memory Grant XE\MemoryGrant.xel',max_file_size=(20)) +WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) +GO + +-- Execute in 2016 for xEvent +USE [memgrants] +GO +DBCC FREEPROCCACHE +GO +ALTER EVENT SESSION [MemoryGrantXE] ON SERVER STATE = START +GO +SELECT o.col3, o.col2, d.col2 +FROM orders o +JOIN orders_detail d ON o.col2 = d.col1 +WHERE o.col3 <= 8000 +OPTION (LOOP JOIN, MAXDOP 1, MIN_GRANT_PERCENT = 20) +GO +ALTER EVENT SESSION [MemoryGrantXE] ON SERVER STATE = STOP +GO diff --git a/samples/demos/mssqltiger/xEvents/MemoryGrant_XE_Setup.sql b/samples/demos/mssqltiger/xEvents/MemoryGrant_XE_Setup.sql new file mode 100644 index 00000000..62ee3677 --- /dev/null +++ b/samples/demos/mssqltiger/xEvents/MemoryGrant_XE_Setup.sql @@ -0,0 +1,71 @@ +USE [master] +GO +IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'memgrants') +CREATE DATABASE [memgrants] +GO + +USE [memgrants] +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[orders]') AND type in (N'U')) +BEGIN +CREATE TABLE [dbo].[orders]( + [col1] [int] NOT NULL, + [col2] [int] NULL, + [col3] [int] NULL, +PRIMARY KEY CLUSTERED +( + [col1] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] +END +GO + +SET NOCOUNT ON +GO +DECLARE @x int +SET @x = 0 +WHILE (@x < 10000000) +BEGIN + INSERT INTO [dbo].[orders] VALUES (@x, @x, @x) + SET @x = @x + 1 +END +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[orders_detail]') AND type in (N'U')) +BEGIN +CREATE TABLE [dbo].[orders_detail]( + [col1] [int] NULL, + [col2] [int] NULL, + [col3] [char](5000) NOT NULL +) ON [PRIMARY] +END +GO + +DECLARE @x int +DECLARE @y int +SET @x = 0 +SET @y = 1 +WHILE (@x < 10000) +BEGIN + INSERT INTO [dbo].[orders_detail] VALUES (@x, @y, 'x') + IF ((@y % 100) = 0) + BEGIN + SET @y = 1 + SET @x = @x + 1 + END + SET @y = @y + 1 +END +GO + +SET NOCOUNT OFF +GO + +IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[orders_detail]') AND name = N'od_cl_idx') +CREATE UNIQUE CLUSTERED INDEX [od_cl_idx] ON [dbo].[orders_detail] +( + [col1] ASC, + [col2] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +GO + diff --git a/samples/demos/mssqltiger/xEvents/PerfStats_XE_Demo.sql b/samples/demos/mssqltiger/xEvents/PerfStats_XE_Demo.sql new file mode 100644 index 00000000..8159ee45 --- /dev/null +++ b/samples/demos/mssqltiger/xEvents/PerfStats_XE_Demo.sql @@ -0,0 +1,42 @@ +-- Make sure Optimize for Adhoc Workloads is not active if demo'ing - that is why mt demo failed. + +DROP EVENT SESSION [QueryProfileXE] ON SERVER +GO +CREATE EVENT SESSION [QueryProfileXE] ON SERVER +ADD EVENT sqlserver.query_thread_profile( + ACTION(sqlos.scheduler_id,sqlserver.database_id,sqlserver.is_system,sqlserver.plan_handle,sqlserver.query_hash_signed,sqlserver.query_plan_hash_signed,sqlserver.server_instance_name,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text)) +ADD TARGET package0.event_file(SET filename=N'C:\Demos\QueryProfileXE.xel',max_file_size=(50),max_rollover_files=(2)) +--ADD TARGET package0.ring_buffer(SET max_memory=(25600)) +WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) +GO + +-- Get Actual Exec plan to compare to XE +--USE AdventureWorks2014 +USE AdventureWorks2016CTP3 +GO + +DBCC FREEPROCCACHE +GO +ALTER EVENT SESSION [QueryProfileXE] ON SERVER STATE = START +GO +SELECT * +FROM Sales.SalesOrderDetail sod +INNER JOIN Production.Product p ON sod.ProductID = p.ProductID +ORDER BY Style DESC +OPTION (MAXDOP 1) +GO +ALTER EVENT SESSION [QueryProfileXE] ON SERVER STATE = STOP +GO + +-- After running query, get plan handle and run below to see new columns in DMV +SELECT * FROM sys.dm_exec_query_stats +WHERE plan_handle = 0x0600050006F60819800281514E02000001000000000000000000000000000000000000000000000000000000 +GO +-- And to get the plan from cache +SELECT * FROM sys.dm_exec_query_plan(0x0600050006F60819800281514E02000001000000000000000000000000000000000000000000000000000000) +GO + +-- After running query, get new signed query or query plan hash and run below to see new columns in DMV +SELECT * FROM sys.dm_exec_query_stats +WHERE CAST(query_hash AS BIGINT) = -5396503127623128976; +--WHERE CAST(query_plan_hash AS BIGINT) = 3230654061787450360 \ No newline at end of file diff --git a/samples/demos/mssqltiger/xEvents/SortWarning.sql b/samples/demos/mssqltiger/xEvents/SortWarning.sql new file mode 100644 index 00000000..9cfa371b --- /dev/null +++ b/samples/demos/mssqltiger/xEvents/SortWarning.sql @@ -0,0 +1,33 @@ +-- Sort Spill + +-- Create xEvent session +DROP EVENT SESSION [SortSpills] ON SERVER +GO +CREATE EVENT SESSION [SortSpills] ON SERVER +ADD EVENT sqlserver.sort_warning( + ACTION(sqlserver.database_name,sqlserver.is_system,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_hash_signed,sqlserver.query_plan_hash,sqlserver.query_plan_hash_signed,sqlserver.session_nt_username,sqlserver.sql_text)) +ADD TARGET package0.event_file(SET filename=N'C:\IP\Tiger\TR23\Demos\Demo 1.1 - Spills\SortSpills.xel',max_file_size=(50),max_rollover_files=(2)) +WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) +GO + +USE AdventureWorks2014 +--USE AdventureWorks2016CTP3 +GO +--Execute +DBCC FREEPROCCACHE +GO +ALTER EVENT SESSION [SortSpills] ON SERVER STATE = START +GO +SELECT * +FROM Sales.SalesOrderDetail SOD +INNER JOIN Production.Product P ON SOD.ProductID = P.ProductID +ORDER BY Style +OPTION (QUERYTRACEON 9481) +GO +ALTER EVENT SESSION [SortSpills] ON SERVER STATE = STOP +GO + +/* +Observe the type of Spill = 1 +Means one pass over the data was enough to complete the sort in the Worktable +*/ \ No newline at end of file