Skip to content

Commit cb4d1cb

Browse files
authored
Add files via upload
1 parent 101d864 commit cb4d1cb

36 files changed

Lines changed: 3394 additions & 0 deletions
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
<documentation>
3+
<summary>Detail Job History</summary>
4+
<returns>1 result set with detailed jobs information.</returns>
5+
<issues>No</issues>
6+
<author>Max Vernon</author>
7+
<created>2019-07-21</created>
8+
<modified></modified>
9+
<version>1.0</version>
10+
<sourceLink>https://github.com/ktaranov/sqlserver-kit/blob/master/Scripts/How_much_will_it_cost_or_save_to_rebuild_that_index.sql</sourceLink>
11+
<originalLink>https://www.sqlservercentral.com/articles/rebuild-index</originalLink>
12+
</documentation>
13+
*/
14+
15+
/**************************************************************************************************
16+
Purpose:
17+
Display some things about indexes that we’d normally like to know plus it calculates how much
18+
extra space would be saved or used after a REBUILD for the current Fill Factor and for the 70, 80,
19+
90, and 100% Fill Factors.
20+
Progammers Notes:
21+
22+
1. Keep in mind that these are all based on averages and so should be considered as approximations.
23+
Also, indexes with very wide rows where there are less than 20 or so rows per page can cause
24+
less accurate approximations.
25+
2. It would be quite easy to turn this into a system stored procedure that could be executed from
26+
any database.
27+
3. Note that this has only been tested for non-partitioned rowstore indexes.
28+
Revision History:
29+
Rev 00 - 21 Jul 2019 - Jeff Moden
30+
- Borrow parts of a much larger stored procedure that I use.
31+
**************************************************************************************************/
32+
WITH cteStats AS
33+
(--===== This CTE is used mostly to rename some of the very long names in the DMF.
34+
SELECT DBName = DB_NAME()
35+
,ObjectID = ips.object_id
36+
,IndexID = ips.index_id
37+
,FragPct = CONVERT(INT,ips.avg_fragmentation_in_percent)
38+
,AvgFragSize = avg_fragment_size_in_pages
39+
,PageDensity = ips.avg_page_space_used_in_percent
40+
,PageCnt = ips.page_count
41+
,RowCnt = ips.record_count
42+
,CurSizeMB = ips.page_count/128 --Integer math produces whole numbers here.
43+
FROM sys.dm_db_index_physical_stats (DB_ID(),NULL,NULL,NULL,'SAMPLED') ips
44+
WHERE ips.index_id > 0 --NOT a HEAP
45+
AND ips.page_count > 128 --This is 1 MB or 16 Extents and could be parameterized.
46+
)
47+
SELECT stats.DBName
48+
,SchemaName = OBJECT_SCHEMA_NAME(stats.ObjectID)
49+
,ObjectName = OBJECT_NAME(stats.ObjectID)
50+
,stats.ObjectID
51+
,IndexName = idx.name
52+
,stats.IndexID
53+
,CurFillFactor = idx.fill_factor
54+
,stats.FragPct
55+
,stats.AvgFragSize
56+
,stats.PageDensity
57+
,stats.PageCnt
58+
,stats.RowCnt
59+
,stats.CurSizeMB
60+
,SavingsMBCur = CONVERT(INT,(stats.PageCnt-(stats.PageDensity/ISNULL(NULLIF(idx.fill_factor,0),100)*stats.PageCnt))/128.0)
61+
,SavingsMB070 = CONVERT(INT,(stats.PageCnt-(stats.PageDensity/ 70*stats.PageCnt))/128.0)
62+
,SavingsMB080 = CONVERT(INT,(stats.PageCnt-(stats.PageDensity/ 80*stats.PageCnt))/128.0)
63+
,SavingsMB090 = CONVERT(INT,(stats.PageCnt-(stats.PageDensity/ 90*stats.PageCnt))/128.0)
64+
,SavingsMB100 = CONVERT(INT,(stats.PageCnt-(stats.PageDensity/100*stats.PageCnt))/128.0)
65+
FROM cteStats stats
66+
JOIN sys.indexes idx
67+
ON stats.ObjectID = idx.object_id
68+
AND stats.IndexID = idx.index_id
69+
;

Scripts/How_old_your_backups.sql

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
Author: Tim Ford
3+
Original link: http://sqlmag.com/database-backup-and-recovery/how-old-are-your-backups
4+
*/
5+
WITH full_backups AS (
6+
SELECT ROW_NUMBER() OVER(PARTITION BY BS.database_name,
7+
BS.type
8+
ORDER BY BS.database_name ASC,
9+
BS.backup_finish_date DESC
10+
) AS [Row Number],
11+
D.name AS [database_name],
12+
BS.backup_set_id,
13+
BS.type AS backup_type,
14+
BS.backup_finish_date,
15+
D.recovery_model_desc
16+
FROM master.sys.databases AS D
17+
LEFT JOIN msdb.dbo.[backupset] AS BS
18+
ON D.name = BS.database_name
19+
/* FILTERING OPTIONS*/
20+
--WHERE BS.[type] = '<backup_type,,D>'
21+
--WHERE BS.[name] = '<database_name,,Foo_DB>'
22+
)
23+
SELECT FB.database_name,
24+
CASE FB.backup_type
25+
WHEN 'D' THEN 'Data'
26+
WHEN 'I' THEN 'Differential'
27+
WHEN 'L' THEN 'Transaction Log'
28+
END AS backup_type_desc,
29+
FB.recovery_model_desc,
30+
FB.backup_finish_date,
31+
BMF.physical_device_name,
32+
DATEDIFF(hour, FB.backup_finish_date, GETDATE()) AS backup_hours,
33+
DATEDIFF(minute, FB.backup_finish_date, GETDATE()) AS backup_minutes
34+
FROM full_backups FB
35+
LEFT JOIN msdb.dbo.[backupset] BS ON FB.backup_set_id = BS.backup_set_id
36+
LEFT JOIN msdb.dbo.backupmediafamily BMF ON BS.media_set_id = BMF.media_set_id
37+
WHERE FB.[Row Number] = 1
38+
ORDER BY FB.database_name, FB.[Row Number], FB.backup_type;
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/*
2+
Author: Kendra Little
3+
Original link: https://www.littlekendra.com/2017/01/24/how-to-find-queries-using-an-index-and-queries-using-index-hints/
4+
*/
5+
6+
--Search for queries in the execution plan cache
7+
--Simply plug the name of the index you’re looking for into this query. If you have multiple databases with the same index name,
8+
--you’ll need to add additional criteria to get just the database you’re looking for.
9+
SELECT
10+
querystats.plan_handle,
11+
querystats.query_hash,
12+
SUBSTRING(sqltext.text, (querystats.statement_start_offset / 2) + 1,
13+
(CASE querystats.statement_end_offset
14+
WHEN -1 THEN DATALENGTH(sqltext.text)
15+
ELSE querystats.statement_end_offset
16+
END - querystats.statement_start_offset) / 2 + 1) AS sqltext,
17+
querystats.execution_count,
18+
querystats.total_logical_reads,
19+
querystats.total_logical_writes,
20+
querystats.creation_time,
21+
querystats.last_execution_time,
22+
CAST(query_plan AS xml) as plan_xml
23+
FROM sys.dm_exec_query_stats as querystats
24+
CROSS APPLY sys.dm_exec_text_query_plan
25+
(querystats.plan_handle, querystats.statement_start_offset, querystats.statement_end_offset)
26+
as textplan
27+
CROSS APPLY sys.dm_exec_sql_text(querystats.sql_handle) AS sqltext
28+
WHERE
29+
textplan.query_plan like '%PK_Sales_Invoices%'
30+
ORDER BY querystats.last_execution_time DESC
31+
OPTION (RECOMPILE);
32+
GO
33+
34+
35+
--Find queries using the index in Query Store
36+
--If you’ve enabled the SQL Server 2016+ Query Store on your databases, you’ve got something better to search than the plan cache
37+
SELECT
38+
qsq.query_id,
39+
qsq.query_hash,
40+
(SELECT TOP 1 qsqt.query_sql_text FROM sys.query_store_query_text qsqt
41+
WHERE qsqt.query_text_id = MAX(qsq.query_text_id)) AS sqltext,
42+
SUM(qrs.count_executions) AS execution_count,
43+
SUM(qrs.count_executions) * AVG(qrs.avg_logical_io_reads) as est_logical_reads,
44+
SUM(qrs.count_executions) * AVG(qrs.avg_logical_io_writes) as est_writes,
45+
MIN(qrs.last_execution_time AT TIME ZONE 'Pacific Standard Time') as min_execution_time_PST,
46+
MAX(qrs.last_execution_time AT TIME ZONE 'Pacific Standard Time') as last_execution_time_PST,
47+
SUM(qsq.count_compiles) AS sum_compiles,
48+
TRY_CONVERT(XML, (SELECT TOP 1 qsp2.query_plan from sys.query_store_plan qsp2
49+
WHERE qsp2.query_id=qsq.query_id
50+
ORDER BY qsp2.plan_id DESC)) AS query_plan
51+
FROM sys.query_store_query qsq
52+
JOIN sys.query_store_plan qsp on qsq.query_id=qsp.query_id
53+
CROSS APPLY (SELECT TRY_CONVERT(XML, qsp.query_plan) AS query_plan_xml) AS qpx
54+
JOIN sys.query_store_runtime_stats qrs on qsp.plan_id = qrs.plan_id
55+
JOIN sys.query_store_runtime_stats_interval qsrsi on qrs.runtime_stats_interval_id=qsrsi.runtime_stats_interval_id
56+
WHERE
57+
qsp.query_plan like N'%PK_Sales_Invoices%'
58+
AND qsp.query_plan not like '%query_store_runtime_stats%' /* Not a query store query */
59+
AND qsp.query_plan not like '%dm_exec_sql_text%' /* Not a query searching the plan cache */
60+
GROUP BY
61+
qsq.query_id, qsq.query_hash
62+
ORDER BY est_logical_reads DESC
63+
OPTION (RECOMPILE);
64+
GO
65+
66+
67+
--Search the execution plan cache for index hints
68+
--To find forced indexes in the plan cache, look for plans that contain ‘%ForcedIndex=”1″%’
69+
SELECT
70+
querystats.plan_handle,
71+
querystats.query_hash,
72+
SUBSTRING(sqltext.text, (querystats.statement_start_offset / 2) + 1,
73+
(CASE querystats.statement_end_offset
74+
WHEN -1 THEN DATALENGTH(sqltext.text)
75+
ELSE querystats.statement_end_offset
76+
END - querystats.statement_start_offset) / 2 + 1) AS sqltext,
77+
querystats.execution_count,
78+
querystats.total_logical_reads,
79+
querystats.total_logical_writes,
80+
querystats.creation_time,
81+
querystats.last_execution_time,
82+
CAST(query_plan AS xml) as plan_xml
83+
FROM sys.dm_exec_query_stats as querystats
84+
CROSS APPLY sys.dm_exec_text_query_plan
85+
(querystats.plan_handle, querystats.statement_start_offset, querystats.statement_end_offset)
86+
as textplan
87+
CROSS APPLY sys.dm_exec_sql_text(querystats.sql_handle) AS sqltext
88+
WHERE
89+
textplan.query_plan like N'%ForcedIndex="1"%'
90+
and UPPER(sqltext.text) like N'%INDEX%'
91+
OPTION (RECOMPILE);
92+
GO
93+
94+
95+
--Find index hints in Query Store
96+
--If you’ve enabled the SQL Server 2016+ Query Store on your databases
97+
SELECT
98+
qsq.query_id,
99+
qsq.query_hash,
100+
(SELECT TOP 1 qsqt.query_sql_text FROM sys.query_store_query_text qsqt
101+
WHERE qsqt.query_text_id = MAX(qsq.query_text_id)) AS sqltext,
102+
SUM(qrs.count_executions) AS execution_count,
103+
SUM(qrs.count_executions) * AVG(qrs.avg_logical_io_reads) as est_logical_reads,
104+
SUM(qrs.count_executions) * AVG(qrs.avg_logical_io_writes) as est_writes,
105+
MIN(qrs.last_execution_time AT TIME ZONE 'Pacific Standard Time') as min_execution_time_PST,
106+
MAX(qrs.last_execution_time AT TIME ZONE 'Pacific Standard Time') as last_execution_time_PST,
107+
SUM(qsq.count_compiles) AS sum_compiles,
108+
TRY_CONVERT(XML, (SELECT TOP 1 qsp2.query_plan from sys.query_store_plan qsp2
109+
WHERE qsp2.query_id=qsq.query_id
110+
ORDER BY qsp2.plan_id DESC)) AS query_plan
111+
FROM sys.query_store_query qsq
112+
JOIN sys.query_store_plan qsp on qsq.query_id=qsp.query_id
113+
CROSS APPLY (SELECT TRY_CONVERT(XML, qsp.query_plan) AS query_plan_xml) AS qpx
114+
JOIN sys.query_store_runtime_stats qrs on qsp.plan_id = qrs.plan_id
115+
JOIN sys.query_store_runtime_stats_interval qsrsi on qrs.runtime_stats_interval_id=qsrsi.runtime_stats_interval_id
116+
WHERE
117+
qsp.query_plan like N'%ForcedIndex="1"%'
118+
GROUP BY
119+
qsq.query_id, qsq.query_hash
120+
ORDER BY est_logical_reads DESC
121+
OPTION (RECOMPILE);
122+
GO
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
Author: Jose M Jurado
3+
Created Date: 2017-01-21
4+
Original link: https://blogs.msdn.microsoft.com/azuresqldbsupport/2017/01/21/lesson-learned-19-how-to-obtain-the-deadlocks-of-your-azure-sql-database/
5+
Source link: https://github.com/ktaranov/sqlserver-kit/blob/master/Scripts/How_to_obtain_the_deadlocks_on_Azure.sql
6+
Modified: 2019-03-18 by Konstantin Taranov
7+
*/
8+
9+
USE master;
10+
GO
11+
12+
WITH CTE AS (
13+
SELECT CAST(event_data AS XML) AS [target_data_XML]
14+
FROM sys.fn_xe_telemetry_blob_target_read_file('dl', null, null, null)
15+
)
16+
SELECT target_data_XML.value('(/event/@timestamp)[1]', 'DateTime2') AS [Timestamp]
17+
, target_data_XML.query('/event/data[@name=''xml_report'']/value/deadlock') AS deadlock_xml
18+
, target_data_XML.query('/event/data[@name=''database_name'']/value').value('(/value)[1]', 'nvarchar(100)') AS [db_name]
19+
FROM CTE;

Scripts/IN_Memory_Example_2014.sql

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*
2+
Author: Konstantin Taranov
3+
Link: https://github.com/ktaranov/sqlserver-kit/blob/master/Scripts/IN_Memory_Example_2014.sql
4+
*/
5+
USE master;
6+
GO
7+
8+
DECLARE @databaseFilePath NVARCHAR(1000) = N'';
9+
SELECT @databaseFilePath = SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
10+
FROM master.sys.master_files
11+
WHERE database_id = 1 AND file_id = 1;
12+
DECLARE @databaseName SYSNAME = N'ಠ ಠ 14 Test';
13+
DECLARE @tsqlStatement NVARCHAR(4000) = N'';
14+
DECLARE @debug BIT = 0;
15+
16+
SET @tsqlStatement = '
17+
IF DB_ID(N''@databaseName'') IS NOT NULL
18+
BEGIN
19+
ALTER DATABASE [@databaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
20+
DROP DATABASE [@databaseName];
21+
END;
22+
23+
CREATE DATABASE [@databaseName]
24+
CONTAINMENT = NONE
25+
ON PRIMARY
26+
(NAME = N''@databaseName'', FILENAME = N''@databaseFilePath@databaseName.mdf'', SIZE = 64MB, MAXSIZE = UNLIMITED, FILEGROWTH = 64MB),
27+
FILEGROUP [@databaseName] CONTAINS MEMORY_OPTIMIZED_DATA DEFAULT
28+
( NAME = N''@databaseName_mod'', FILENAME = N''@databaseFilePath@databaseName_mod'', MAXSIZE = UNLIMITED)
29+
LOG ON
30+
( NAME = N''@databaseName_log'', FILENAME = N''@databaseFilePath@databaseName_log.ldf'', SIZE = 64MB, MAXSIZE = 2048MB, FILEGROWTH = 64MB);
31+
32+
ALTER DATABASE [@databaseName] SET COMPATIBILITY_LEVEL = 120;
33+
';
34+
35+
SET @tsqlStatement = REPLACE(@tsqlStatement, '@databaseName', @databaseName);
36+
SET @tsqlStatement = REPLACE(@tsqlStatement, '@databaseFilePath', @databaseFilePath);
37+
38+
IF @debug = 1 PRINT(@tsqlStatement)
39+
ELSE
40+
EXEC sp_executesql @tsqlStatement;
41+
42+
43+
SET @tsqlStatement = '
44+
USE [@databaseName];
45+
--UNCOMMENT GO Statement if you want to execute statements after printing in debug mode!!!
46+
--GO
47+
48+
-- configure recommended DB option
49+
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON;
50+
51+
-- memory-optimized table
52+
CREATE TABLE dbo.table1(
53+
c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
54+
c2 NVARCHAR(4000)
55+
)
56+
WITH (MEMORY_OPTIMIZED=ON);
57+
58+
-- non-durable table
59+
CREATE TABLE dbo.temp_table1(
60+
c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
61+
c2 NVARCHAR(4000)
62+
)
63+
WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY);
64+
65+
-- memory-optimized table type
66+
CREATE TYPE dbo.tt_table1 AS TABLE(
67+
c1 INT IDENTITY,
68+
c2 NVARCHAR(4000),
69+
is_transient BIT NOT NULL DEFAULT (0),
70+
INDEX ix_c1 HASH (c1) WITH (BUCKET_COUNT=1024))
71+
WITH (MEMORY_OPTIMIZED=ON);
72+
73+
CREATE TABLE dbo.InMemTable1(
74+
keyColumn INT IDENTITY PRIMARY KEY NONCLUSTERED
75+
, description NCHAR(100) NOT NULL
76+
)
77+
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
78+
79+
INSERT dbo.InMemTable1(description)
80+
VALUES
81+
(REPLICATE(''A'', 100))
82+
,(REPLICATE(''B'', 100))
83+
,(REPLICATE(''C'', 100))
84+
,(REPLICATE(''D'', 100))
85+
,(REPLICATE(''E'', 100))
86+
,(REPLICATE(''F'', 100));
87+
';
88+
89+
SET @tsqlStatement = REPLACE(@tsqlStatement, '@databaseName', @databaseName);
90+
91+
IF @debug = 1 PRINT(@tsqlStatement)
92+
ELSE
93+
EXEC sp_executesql @tsqlStatement;
94+
95+
96+
-- https://stackoverflow.com/a/793362/2298061
97+
DECLARE @UseAndExecStatment NVARCHAR(4000);
98+
SET @UseAndExecStatment = N'USE [' + @databaseName + N']; EXEC sp_executesql @tsqlStatement';
99+
100+
SET @tsqlStatement = N'
101+
CREATE PROCEDURE dbo.native_sp
102+
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
103+
AS
104+
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N''us_english'')
105+
SELECT keyColumn
106+
, description
107+
FROM dbo.InMemTable1;
108+
END;
109+
--EXECUTE dbo.native_sp;';
110+
111+
IF @debug = 1 PRINT(@tsqlStatement)
112+
ELSE
113+
BEGIN
114+
EXEC sp_executesql @UseAndExecStatment,
115+
N'@tsqlStatement NVARCHAR(MAX)', @tsqlStatement = @tsqlStatement;
116+
END;

0 commit comments

Comments
 (0)