Add files via upload

This commit is contained in:
Pedro Lopes
2016-09-15 16:03:48 -07:00
committed by GitHub
parent 903ef5985e
commit 6c05bd89c9
5 changed files with 252 additions and 0 deletions
@@ -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.
*/
@@ -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
@@ -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
@@ -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
@@ -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
*/