-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSQL_Server_Analysis_Query.sql
More file actions
141 lines (116 loc) · 4.15 KB
/
SQL_Server_Analysis_Query.sql
File metadata and controls
141 lines (116 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
SELECT TOP 100
qs.total_elapsed_time / qs.execution_count / 1000000.0 AS average_seconds,
qs.total_elapsed_time / 1000000.0 AS total_seconds,
qs.execution_count,
SUBSTRING (qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) AS individual_query,
o.name AS object_name,
DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
WHERE qt.dbid = DB_ID()
ORDER BY average_seconds DESC;
SELECT TOP 100
(total_logical_reads + total_logical_writes) / qs.execution_count AS average_IO,
(total_logical_reads + total_logical_writes) AS total_IO,
qs.execution_count AS execution_count,
SUBSTRING (qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) AS indivudual_query,
o.name AS object_name,
DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
WHERE qt.dbid = DB_ID()
ORDER BY average_IO DESC;
SELECT st.text,
qp.query_plan,
qs.*
FROM (
SELECT TOP 50 *
FROM sys.dm_exec_query_stats
ORDER BY total_worker_time DESC
) AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
WHERE qs.max_worker_time > 300
OR qs.max_elapsed_time > 300
order by qs.max_elapsed_time desc
--max_worker_time for cpu time... may be highly parallel queries
;
--variables to hold each 'iteration'
DECLARE @query varchar(100)
DECLARE @dbname sysname
DECLARE @vlfs int
--table variable used to 'loop' over databases
DECLARE @databases table (dbname sysname)
INSERT INTO @databases
--only choose online databases
SELECT name FROM sys.databases WHERE state = 0
--table variable to hold results
DECLARE @vlfcounts table
(dbname sysname,
vlfcount int)
--table variable to capture DBCC loginfo output
--changes in the output of DBCC loginfo from SQL2012 mean we have to determine the version
DECLARE @MajorVersion tinyint
SET @MajorVersion = LEFT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)))-1)
IF @MajorVersion < 11 -- pre-SQL2012
BEGIN
declare @dbccloginfo table
(
fileid smallint,
file_size bigint,
start_offset bigint,
fseqno int,
[status] tinyint,
parity tinyint,
create_lsn numeric(25,0)
)
WHILE EXISTS (SELECT TOP 1 dbname FROM @databases)
BEGIN
SET @dbname = (SELECT TOP 1 dbname FROM @databases)
SET @query = 'dbcc loginfo (' + '''' + @dbname + ''') '
INSERT INTO @dbccloginfo
EXEC (@query)
SET @vlfs = @@rowcount
INSERT @vlfcounts
VALUES(@dbname, @vlfs)
DELETE FROM @databases WHERE dbname = @dbname
END --while
END
ELSE
BEGIN
DECLARE @dbccloginfo2012 table
(
RecoveryUnitId int,
fileid smallint,
file_size bigint,
start_offset bigint,
fseqno int,
[status] tinyint,
parity tinyint,
create_lsn numeric(25,0)
)
WHILE EXISTS (SELECT TOP 1 dbname FROM @databases)
BEGIN
SET @dbname = (SELECT TOP 1 dbname FROM @databases)
SET @query = 'dbcc loginfo (' + '''' + @dbname + ''') '
INSERT INTO @dbccloginfo2012
EXEC (@query)
SET @vlfs = @@rowcount
INSERT @vlfcounts
VALUES (@dbname, @vlfs)
DELETE FROM @databases WHERE dbname = @dbname
END --while
END
--output the full list
SELECT dbname, vlfcount
FROM @vlfcounts
ORDER BY dbname
;