mirror of
https://github.com/Microsoft/sql-server-samples.git
synced 2025-12-08 14:58:54 +00:00
Add files via upload
This commit is contained in:
@@ -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
|
||||
*/
|
||||
Reference in New Issue
Block a user