May 17, 2026, 11:40 PM
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,16 @@
|
||||
SELECT ag.name AS ag_name, ar.replica_server_name AS ag_replica_server, dr_state.database_id as database_id,
|
||||
is_ag_replica_local = CASE
|
||||
WHEN ar_state.is_local = 1 THEN N'LOCAL'
|
||||
ELSE 'REMOTE'
|
||||
END ,
|
||||
ag_replica_role = CASE
|
||||
WHEN ar_state.role_desc IS NULL THEN N'DISCONNECTED'
|
||||
ELSE ar_state.role_desc
|
||||
END,
|
||||
dr_state.last_hardened_time, dr_state.last_redone_time
|
||||
FROM (( sys.availability_groups AS ag JOIN sys.availability_replicas AS ar ON ag.group_id = ar.group_id )
|
||||
JOIN sys.dm_hadr_availability_replica_states AS ar_state ON ar.replica_id = ar_state.replica_id)
|
||||
JOIN sys.dm_hadr_database_replica_states dr_state
|
||||
on ag.group_id = dr_state.group_id and dr_state.replica_id = ar_state.replica_id
|
||||
-- Podajemy ID Bazy, którą sprawdzamy
|
||||
-- where dr_state.database_id = 35
|
||||
@@ -0,0 +1,104 @@
|
||||
/********************************************************************************************
|
||||
|
||||
*** Blocking and deadlock monitor ***
|
||||
------------------------------------------------
|
||||
|
||||
I have prepared this script to monitor blocking sessions with sp_whoisactive,
|
||||
So first you need tocreate sp_whoisactive stored procedure,
|
||||
please downad it from the link,
|
||||
|
||||
https://github.com/SqlAdmin/AwesomeSQLServer/blob/master/T-SQL%20Scripts/sp_whoisactive.sql
|
||||
|
||||
*******************************************************************************************/
|
||||
|
||||
|
||||
-- To get overall info about current sessions
|
||||
|
||||
EXEC sp_whoisactive
|
||||
---------------------------------------
|
||||
/*** 1. Monitor blocking session ***/
|
||||
---------------------------------------
|
||||
|
||||
EXEC sp_WhoIsActive @find_block_leaders = 1,
|
||||
@output_column_list = '[dd%][session_id][database_name][login_name] [sql_text][wait_info][blocking_session_id][blocked_session_count]',
|
||||
@sort_order = '[start_time] ASC';
|
||||
|
||||
|
||||
---------------------------------------
|
||||
/*** 2. Monitor deadlocking session ***/
|
||||
---------------------------------------
|
||||
|
||||
WITH [Blocking]
|
||||
AS (SELECT
|
||||
w.[session_id],
|
||||
s.[original_login_name],
|
||||
s.[login_name],
|
||||
w.[wait_duration_ms],
|
||||
w.[wait_type],
|
||||
r.[status],
|
||||
r.[wait_resource],
|
||||
w.[resource_description],
|
||||
s.[program_name],
|
||||
w.[blocking_session_id],
|
||||
s.[host_name],
|
||||
r.[command],
|
||||
r.[percent_complete],
|
||||
r.[cpu_time],
|
||||
r.[total_elapsed_time],
|
||||
r.[reads],
|
||||
r.[writes],
|
||||
r.[logical_reads],
|
||||
r.[row_count],
|
||||
q.[text],
|
||||
q.[dbid],
|
||||
p.[query_plan],
|
||||
r.[plan_handle]
|
||||
FROM [sys].[dm_os_waiting_tasks] w
|
||||
INNER JOIN [sys].[dm_exec_sessions] s
|
||||
ON w.[session_id] = s.[session_id]
|
||||
INNER JOIN [sys].[dm_exec_requests] r
|
||||
ON s.[session_id] = r.[session_id]
|
||||
CROSS APPLY [sys].[dm_exec_sql_text](r.[plan_handle]) q
|
||||
CROSS APPLY [sys].[dm_exec_query_plan](r.[plan_handle]) p
|
||||
WHERE w.[session_id] > 50
|
||||
AND w.[wait_type] NOT IN ('DBMIRROR_DBM_EVENT'
|
||||
, 'ASYNC_NETWORK_IO'))
|
||||
SELECT
|
||||
b.[session_id] AS [WaitingSessionID],
|
||||
b.[blocking_session_id] AS [BlockingSessionID],
|
||||
b.[login_name] AS [WaitingUserSessionLogin],
|
||||
s1.[login_name] AS [BlockingUserSessionLogin],
|
||||
b.[original_login_name] AS [WaitingUserConnectionLogin],
|
||||
s1.[original_login_name] AS [BlockingSessionConnectionLogin],
|
||||
b.[wait_duration_ms] AS [WaitDuration],
|
||||
b.[wait_type] AS [WaitType],
|
||||
t.[request_mode] AS [WaitRequestMode],
|
||||
UPPER(b.[status]) AS [WaitingProcessStatus],
|
||||
UPPER(s1.[status]) AS [BlockingSessionStatus],
|
||||
b.[wait_resource] AS [WaitResource],
|
||||
t.[resource_type] AS [WaitResourceType],
|
||||
t.[resource_database_id] AS [WaitResourceDatabaseID],
|
||||
DB_NAME(t.[resource_database_id]) AS [WaitResourceDatabaseName],
|
||||
b.[resource_description] AS [WaitResourceDescription],
|
||||
b.[program_name] AS [WaitingSessionProgramName],
|
||||
s1.[program_name] AS [BlockingSessionProgramName],
|
||||
b.[host_name] AS [WaitingHost],
|
||||
s1.[host_name] AS [BlockingHost],
|
||||
b.[command] AS [WaitingCommandType],
|
||||
b.[text] AS [WaitingCommandText],
|
||||
b.[row_count] AS [WaitingCommandRowCount],
|
||||
b.[percent_complete] AS [WaitingCommandPercentComplete],
|
||||
b.[cpu_time] AS [WaitingCommandCPUTime],
|
||||
b.[total_elapsed_time] AS [WaitingCommandTotalElapsedTime],
|
||||
b.[reads] AS [WaitingCommandReads],
|
||||
b.[writes] AS [WaitingCommandWrites],
|
||||
b.[logical_reads] AS [WaitingCommandLogicalReads],
|
||||
b.[query_plan] AS [WaitingCommandQueryPlan],
|
||||
b.[plan_handle] AS [WaitingCommandPlanHandle]
|
||||
FROM [Blocking] b
|
||||
INNER JOIN [sys].[dm_exec_sessions] s1
|
||||
ON b.[blocking_session_id] = s1.[session_id]
|
||||
INNER JOIN [sys].[dm_tran_locks] t
|
||||
ON t.[request_session_id] = b.[session_id]
|
||||
WHERE t.[request_status] = 'WAIT'
|
||||
GO
|
||||
@@ -0,0 +1,250 @@
|
||||
--=========================================--
|
||||
/*** SQL SERVER CPU MONITORING QUERIES ***/
|
||||
--=========================================------
|
||||
-- Supported Versions SQL server 2008 and higher
|
||||
-------------------------------------------------
|
||||
|
||||
-------------------------------------
|
||||
/*** 1. Current CPU Utilization ***/
|
||||
-------------------------------------
|
||||
|
||||
DECLARE @ts BIGINT;
|
||||
DECLARE @lastNmin TINYINT;
|
||||
|
||||
SELECT @ts = (SELECT cpu_ticks / ( cpu_ticks / ms_ticks )
|
||||
FROM sys.dm_os_sys_info);
|
||||
|
||||
SELECT TOP(1) Dateadd(ms, -1 * ( @ts - [timestamp] ), Getdate())AS [EventTime],
|
||||
sqlprocessutilization AS
|
||||
[SQL Server Utilization],
|
||||
100 - systemidle - sqlprocessutilization AS
|
||||
[Other Process CPU_Utilization],
|
||||
systemidle AS [System Idle]
|
||||
FROM (SELECT
|
||||
record.value('(./Record/@id)[1]', 'int') AS record_id,
|
||||
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [SystemIdle],
|
||||
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int')AS [SQLProcessUtilization],
|
||||
[timestamp]
|
||||
FROM (SELECT[timestamp],
|
||||
CONVERT(XML, record) AS [record]
|
||||
FROM sys.dm_os_ring_buffers
|
||||
WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
|
||||
AND record LIKE'%%')AS x)AS y
|
||||
ORDER BY record_id DESC;
|
||||
|
||||
|
||||
---------------------------------------------
|
||||
/*** 2.CPU Utilization for last N minutes***/
|
||||
---------------------------------------------
|
||||
-- Mention the minutes in @lastNmin Parameter
|
||||
|
||||
DECLARE @ts BIGINT;
|
||||
DECLARE @lastNmin TINYINT;
|
||||
|
||||
SET @lastNmin = 15; --Mention the Minutes Here
|
||||
|
||||
SELECT @ts = (SELECT cpu_ticks / ( cpu_ticks / ms_ticks )
|
||||
FROM sys.dm_os_sys_info);
|
||||
|
||||
SELECT TOP(@lastNmin) Dateadd(ms, -1 * ( @ts - [timestamp] ), Getdate())AS
|
||||
[EventTime],
|
||||
sqlprocessutilization AS
|
||||
[SQL Server Utilization],
|
||||
100 - systemidle - sqlprocessutilization AS
|
||||
[Other Process CPU_Utilization],
|
||||
systemidle AS
|
||||
[System Idle]
|
||||
FROM (SELECT
|
||||
record.value('(./Record/@id)[1]', 'int') AS record_id,
|
||||
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [SystemIdle],
|
||||
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int')AS [SQLProcessUtilization],
|
||||
[timestamp]
|
||||
FROM (SELECT[timestamp],
|
||||
CONVERT(XML, record) AS [record]
|
||||
FROM sys.dm_os_ring_buffers
|
||||
WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
|
||||
AND record LIKE'%%')AS x)AS y
|
||||
ORDER BY record_id DESC;
|
||||
|
||||
|
||||
------------------------------------------
|
||||
/*** 3.Database wise CPU Utilization ***/
|
||||
------------------------------------------
|
||||
|
||||
WITH db_cpu
|
||||
AS (SELECT databaseid,
|
||||
Db_name(databaseid) AS [DatabaseName],
|
||||
Sum(total_worker_time)AS [CPU_Time(Ms)]
|
||||
FROM sys.dm_exec_query_stats AS qs
|
||||
CROSS apply(SELECT CONVERT(INT, value)AS [DatabaseID]
|
||||
FROM sys.Dm_exec_plan_attributes(qs.plan_handle)
|
||||
WHERE attribute = N'dbid')AS epa
|
||||
GROUP BY databaseid)
|
||||
SELECT Row_number()
|
||||
OVER(
|
||||
ORDER BY [cpu_time(ms)] DESC) AS [SNO],
|
||||
databasename AS [DBName]
|
||||
,
|
||||
[cpu_time(ms)],
|
||||
Cast([cpu_time(ms)] * 1.0 / Sum([cpu_time(ms)])
|
||||
OVER() * 100.0 AS DECIMAL(5, 2))AS
|
||||
[CPUPercent]
|
||||
FROM db_cpu
|
||||
WHERE databaseid > 4 -- system databases
|
||||
AND databaseid <> 32767 -- ResourceDB
|
||||
ORDER BY sno
|
||||
OPTION(recompile);
|
||||
|
||||
|
||||
---------------------------------------
|
||||
/*** 4.Query Wise CPU Utilization ***/
|
||||
---------------------------------------
|
||||
-- This Query will show the queries and its CPU time if the avg CPU usgae is > 50
|
||||
-- You can modify this in IF @AvgCPUUtilization >= 50
|
||||
|
||||
SET nocount ON
|
||||
|
||||
DECLARE @ts_now BIGINT
|
||||
DECLARE @AvgCPUUtilization DECIMAL(10, 2)
|
||||
|
||||
SELECT @ts_now = cpu_ticks / ( cpu_ticks / ms_ticks )
|
||||
FROM sys.dm_os_sys_info
|
||||
|
||||
-- load the CPU utilization in the past 10 minutes into the temp table, you can load them into a permanent table
|
||||
SELECT TOP(10) sqlprocessutilization AS
|
||||
[SQLServerProcessCPUUtilization],
|
||||
systemidle AS
|
||||
[SystemIdleProcess],
|
||||
100 - systemidle - sqlprocessutilization AS
|
||||
[OtherProcessCPU Utilization],
|
||||
Dateadd(ms, -1 * ( @ts_now - [timestamp] ), Getdate()) AS
|
||||
[EventTime]
|
||||
INTO #cpuutilization
|
||||
FROM (SELECT record.value('(./Record/@id)[1]', 'int')
|
||||
AS record_id,
|
||||
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]',
|
||||
'int')
|
||||
AS [SystemIdle],
|
||||
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [SQLProcessUtilization],
|
||||
[timestamp]
|
||||
FROM (SELECT [timestamp],
|
||||
CONVERT(XML, record) AS [record]
|
||||
FROM sys.dm_os_ring_buffers
|
||||
WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
|
||||
AND record LIKE '%<SystemHealth>%') AS x) AS y
|
||||
ORDER BY record_id DESC
|
||||
|
||||
-- check if the average CPU utilization was over 50% in the past 10 minutes
|
||||
|
||||
SELECT @AvgCPUUtilization = Avg([sqlserverprocesscpuutilization]
|
||||
+ [otherprocesscpu utilization])
|
||||
FROM #cpuutilization
|
||||
WHERE eventtime > Dateadd(mm, -10, Getdate())
|
||||
|
||||
IF @AvgCPUUtilization >= 50
|
||||
BEGIN
|
||||
SELECT TOP(10) CONVERT(VARCHAR(25), @AvgCPUUtilization)
|
||||
+ '%' AS
|
||||
[AvgCPUUtilization],
|
||||
Getdate()
|
||||
[Date and Time]
|
||||
,
|
||||
r.cpu_time,
|
||||
r.total_elapsed_time,
|
||||
s.session_id,
|
||||
s.login_name,
|
||||
s.host_name,
|
||||
Db_name(r.database_id) AS
|
||||
DatabaseName
|
||||
,
|
||||
Substring (t.text, ( r.statement_start_offset / 2 ) + 1, (
|
||||
( CASE
|
||||
WHEN r.statement_end_offset = -1 THEN
|
||||
Len(CONVERT(NVARCHAR(max), t.text)) *
|
||||
2
|
||||
ELSE r.statement_end_offset
|
||||
END - r.statement_start_offset ) / 2 ) + 1) AS
|
||||
[IndividualQuery],
|
||||
Substring(text, 1, 200) AS [ParentQuery],
|
||||
r.status,
|
||||
r.start_time,
|
||||
r.wait_type,
|
||||
s.program_name
|
||||
INTO #possiblecpuutilizationqueries
|
||||
FROM sys.dm_exec_sessions s
|
||||
INNER JOIN sys.dm_exec_connections c
|
||||
ON s.session_id = c.session_id
|
||||
INNER JOIN sys.dm_exec_requests r
|
||||
ON c.connection_id = r.connection_id
|
||||
CROSS apply sys.Dm_exec_sql_text(r.sql_handle) t
|
||||
WHERE s.session_id > 50
|
||||
AND r.session_id != @@spid
|
||||
ORDER BY r.cpu_time DESC
|
||||
|
||||
|
||||
SELECT *
|
||||
FROM #possiblecpuutilizationqueries
|
||||
END
|
||||
|
||||
-- drop the temp tables
|
||||
IF Object_id('TEMPDB..#CPUUtilization') IS NOT NULL
|
||||
DROP TABLE #cpuutilization
|
||||
|
||||
IF Object_id('TEMPDB..#PossibleCPUUtilizationQueries') IS NOT NULL
|
||||
DROP TABLE #possiblecpuutilizationqueries
|
||||
|
||||
|
||||
---------------------------------
|
||||
/*** 5.TOP costliest Queries ***/
|
||||
---------------------------------
|
||||
-- This will give top 20 costliest queries which are executed recently.
|
||||
|
||||
SELECT TOP (20) st.text AS Query,
|
||||
qs.execution_count,
|
||||
qs.total_worker_time AS Total_CPU,
|
||||
total_CPU_inSeconds = --Converted from microseconds
|
||||
qs.total_worker_time / 1000000,
|
||||
average_CPU_inSeconds = --Converted from microseconds
|
||||
( qs.total_worker_time / 1000000 ) / qs.execution_count,
|
||||
qs.total_elapsed_time,
|
||||
total_elapsed_time_inSeconds = --Converted from microseconds
|
||||
qs.total_elapsed_time / 1000000,
|
||||
qp.query_plan
|
||||
FROM sys.dm_exec_query_stats 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
|
||||
ORDER BY qs.total_worker_time DESC
|
||||
OPTION (recompile);
|
||||
|
||||
|
||||
-------------------------------------------------------------
|
||||
/*** 5.TOP costliest Queries with batch and more details ***/
|
||||
-------------------------------------------------------------
|
||||
|
||||
SELECT TOP 50
|
||||
[Avg. MultiCore/CPU time(sec)] = qs.total_worker_time / 1000000 / qs.execution_count,
|
||||
[Total MultiCore/CPU time(sec)] = qs.total_worker_time / 1000000,
|
||||
[Avg. Elapsed Time(sec)] = qs.total_elapsed_time / 1000000 / qs.execution_count,
|
||||
[Total Elapsed Time(sec)] = qs.total_elapsed_time / 1000000,
|
||||
qs.execution_count,
|
||||
[Avg. I/O] = (total_logical_reads + total_logical_writes) / qs.execution_count,
|
||||
[Total I/O] = total_logical_reads + total_logical_writes,
|
||||
Query = SUBSTRING(qt.[text], (qs.statement_start_offset / 2) + 1,
|
||||
(
|
||||
(
|
||||
CASE qs.statement_end_offset
|
||||
WHEN -1 THEN DATALENGTH(qt.[text])
|
||||
ELSE qs.statement_end_offset
|
||||
END - qs.statement_start_offset
|
||||
) / 2
|
||||
) + 1
|
||||
),
|
||||
Batch = qt.[text],
|
||||
[DB] = DB_NAME(qt.[dbid]),
|
||||
qs.last_execution_time,
|
||||
qp.query_plan
|
||||
FROM sys.dm_exec_query_stats AS qs
|
||||
CROSS APPLY sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
|
||||
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
|
||||
|
||||
ORDER BY [Total MultiCore/CPU time(sec)] DESC;
|
||||
@@ -0,0 +1,235 @@
|
||||
--==============================================--
|
||||
/*** SQL SERVER Disk Space Monitoring QUERIES ***/
|
||||
--==============================================--
|
||||
|
||||
-- Supported Versions SQL server 2008 and higher
|
||||
-------------------------------------------------
|
||||
|
||||
----------------------------------------------
|
||||
/*** 1. Get all Disks Total and Free Size ***/
|
||||
----------------------------------------------
|
||||
|
||||
|
||||
DECLARE @MOUNTVOL TABLE
|
||||
( MOUNTVOLResult nVARCHAR(500)
|
||||
,ExecCommand nVARCHAR(500))
|
||||
|
||||
INSERT INTO @MOUNTVOL (MOUNTVOLResult)
|
||||
EXEC XP_CMDSHELL 'MOUNTVOL'
|
||||
|
||||
DELETE @MOUNTVOL WHERE MOUNTVOLResult LIKE '%VOLUME%'
|
||||
DELETE @MOUNTVOL WHERE MOUNTVOLResult IS NULL
|
||||
DELETE @MOUNTVOL WHERE MOUNTVOLResult NOT LIKE '%:%'
|
||||
DELETE @MOUNTVOL WHERE MOUNTVOLResult LIKE '%MOUNTVOL%'
|
||||
DELETE @MOUNTVOL WHERE MOUNTVOLResult LIKE '%RECYCLE%'
|
||||
|
||||
UPDATE @MOUNTVOL SET ExecCommand = 'EXEC XP_CMDSHELL ''FSUTIL VOLUME DISKFREE ' + LTRIM(RTRIM(MOUNTVOLResult)) +''''
|
||||
|
||||
DECLARE @DRIVESpace TABLE
|
||||
( DriveLetter VARCHAR(10)
|
||||
,DriveInfo VARCHAR(100))
|
||||
|
||||
WHILE (SELECT COUNT(*) FROM @MOUNTVOL) <>0
|
||||
BEGIN
|
||||
DECLARE @Command nVARCHAR(500), @DriveLetter nVARCHAR(10)
|
||||
Select @Command = ExecCommand, @DriveLetter= MOUNTVOLResult from @MOUNTVOL
|
||||
INSERT INTO @DRIVESpace (DriveInfo) Exec sp_executeSQL @Command
|
||||
UPDATE @DRIVESpace SET DriveLetter=@DriveLetter WHERE DriveLetter IS NULL
|
||||
DELETE FROM @MOUNTVOL WHERE ExecCommand=@Command
|
||||
END
|
||||
|
||||
DECLARE @FinalResults TABLE
|
||||
( DriveLetter nVARCHAR(10)
|
||||
,[TotalDriveSpace(MB)] DECIMAL(18,2)
|
||||
,[UsedSpaceOnDrive(MB)] AS ([TotalDriveSpace(MB)] - [FreeSpaceOnDrive(MB)])
|
||||
,[FreeSpaceOnDrive(MB)] DECIMAL(18,2)
|
||||
,[TotalDriveSpace(GB)] AS CAST(([TotalDriveSpace(MB)]/1024) AS DECIMAL(18,2))
|
||||
,[UsedSpaceOnDrive(GB)] AS CAST((([TotalDriveSpace(MB)] - [FreeSpaceOnDrive(MB)])/1024) AS DECIMAL(18,2))
|
||||
,[FreeSpaceOnDrive(GB)] AS CAST(([FreeSpaceOnDrive(MB)]/1024) AS DECIMAL(18,2))
|
||||
,[%FreeSpace] AS CAST((([FreeSpaceOnDrive(MB)]/[TotalDriveSpace(MB)])*100) AS DECIMAL(18,2)))
|
||||
|
||||
INSERT INTO @FinalResults (DriveLetter, [TotalDriveSpace(MB)],[FreeSpaceOnDrive(MB)])
|
||||
SELECT RTRIM(LTRIM(DriveLetter))
|
||||
,[TotalDriveSpace(MB)] = SUM(CASE WHEN DriveInfo LIKE 'TOTAL # OF BYTES%' THEN CAST(SUBSTRING(DriveInfo, 32, 48) AS FLOAT) ELSE CAST(0 AS FLOAT) END)/1024/1024
|
||||
,[FreeSpaceOnDrive(MB)] = SUM(CASE WHEN DriveInfo LIKE 'TOTAL # OF FREE BYTES%' THEN CAST(SUBSTRING(DriveInfo, 32, 48) AS FLOAT) ELSE CAST(0 AS FLOAT) END)/1024/1024
|
||||
FROM @DRIVESpace
|
||||
WHERE DriveInfo LIKE 'TOTAL # OF %'
|
||||
GROUP BY DriveLetter
|
||||
ORDER BY DriveLetter
|
||||
|
||||
SELECT DriveLetter, [TotalDriveSpace(GB)], [TotalDriveSpace(GB)], [%FreeSpace] FROM @FinalResults
|
||||
|
||||
|
||||
-------------------------------------------------
|
||||
/*** 2. Get databases physical file location ***/
|
||||
-------------------------------------------------
|
||||
|
||||
SELECT DISTINCT Db_name(dovs.database_id)
|
||||
[Database Name],
|
||||
mf.physical_name
|
||||
[Physical File Location],
|
||||
dovs.logical_volume_name AS
|
||||
[Logical Name],
|
||||
dovs.volume_mount_point AS Drive,
|
||||
CONVERT(INT, dovs.available_bytes / 1048576.0 / 1024) AS
|
||||
[Free Space (GB)]
|
||||
FROM sys.master_files mf
|
||||
CROSS apply sys.Dm_os_volume_stats(mf.database_id, mf.file_id) dovs
|
||||
ORDER BY [free space (gb)] ASC
|
||||
|
||||
|
||||
----------------------------------------------
|
||||
/*** 3. List all Databases and its file size ***/
|
||||
----------------------------------------------
|
||||
|
||||
--Data file size
|
||||
DECLARE @dbsize TABLE (
|
||||
Dbname sysname,
|
||||
dbstatus varchar(50),
|
||||
Recovery_Model varchar(40) DEFAULT ('NA'),
|
||||
file_Size_MB decimal(30, 2) DEFAULT (0),
|
||||
Space_Used_MB decimal(30, 2) DEFAULT (0),
|
||||
Free_Space_MB decimal(30, 2) DEFAULT (0)
|
||||
)
|
||||
|
||||
INSERT INTO @dbsize (Dbname, dbstatus, Recovery_Model, file_Size_MB, Space_Used_MB, Free_Space_MB)
|
||||
EXEC sp_msforeachdb 'use [?];
|
||||
select DB_NAME() AS DbName,
|
||||
CONVERT(varchar(20),DatabasePropertyEx(''?'',''Status'')) ,
|
||||
CONVERT(varchar(20),DatabasePropertyEx(''?'',''Recovery'')),
|
||||
sum(size)/128.0 AS File_Size_MB,
|
||||
sum(CAST(FILEPROPERTY(name, ''SpaceUsed'') AS INT))/128.0 as Space_Used_MB,
|
||||
SUM( size)/128.0 - sum(CAST(FILEPROPERTY(name,''SpaceUsed'') AS INT))/128.0 AS Free_Space_MB
|
||||
from sys.database_files where type=0 group by type'
|
||||
|
||||
|
||||
-- log file size
|
||||
DECLARE @logsize TABLE (
|
||||
Dbname sysname,
|
||||
Log_File_Size_MB decimal(38, 2) DEFAULT (0),
|
||||
log_Space_Used_MB decimal(30, 2) DEFAULT (0),
|
||||
log_Free_Space_MB decimal(30, 2) DEFAULT (0)
|
||||
)
|
||||
|
||||
INSERT INTO @logsize (Dbname, Log_File_Size_MB, log_Space_Used_MB, log_Free_Space_MB)
|
||||
EXEC sp_msforeachdb 'use [?];
|
||||
select DB_NAME() AS DbName,
|
||||
sum(size)/128.0 AS Log_File_Size_MB,
|
||||
sum(CAST(FILEPROPERTY(name, ''SpaceUsed'') AS INT))/128.0 as log_Space_Used_MB,
|
||||
SUM( size)/128.0 - sum(CAST(FILEPROPERTY(name,''SpaceUsed'') AS INT))/128.0 AS log_Free_Space_MB
|
||||
from sys.database_files where type=1 group by type'
|
||||
|
||||
-- database free size
|
||||
DECLARE @dbfreesize TABLE (
|
||||
name sysname,
|
||||
database_size varchar(50),
|
||||
Freespace varchar(50) DEFAULT (0.00)
|
||||
)
|
||||
INSERT INTO @dbfreesize (name, database_size, Freespace)
|
||||
EXEC sp_msforeachdb 'use [?];SELECT database_name = db_name()
|
||||
,database_size = ltrim(str((convert(DECIMAL(15, 2), dbsize) + convert(DECIMAL(15, 2), logsize)) * 8192 / 1048576, 15, 2) + ''MB'')
|
||||
,''unallocated space'' = ltrim(str((
|
||||
CASE
|
||||
WHEN dbsize >= reservedpages
|
||||
THEN (convert(DECIMAL(15, 2), dbsize) - convert(DECIMAL(15, 2), reservedpages)) * 8192 / 1048576
|
||||
ELSE 0
|
||||
END
|
||||
), 15, 2) + '' MB'')
|
||||
FROM (
|
||||
SELECT dbsize = sum(convert(BIGINT, CASE
|
||||
WHEN type = 0
|
||||
THEN size
|
||||
ELSE 0
|
||||
END))
|
||||
,logsize = sum(convert(BIGINT, CASE
|
||||
WHEN type <> 0
|
||||
THEN size
|
||||
ELSE 0
|
||||
END))
|
||||
FROM sys.database_files
|
||||
) AS files
|
||||
,(
|
||||
SELECT reservedpages = sum(a.total_pages)
|
||||
,usedpages = sum(a.used_pages)
|
||||
,pages = sum(CASE
|
||||
WHEN it.internal_type IN (
|
||||
202
|
||||
,204
|
||||
,211
|
||||
,212
|
||||
,213
|
||||
,214
|
||||
,215
|
||||
,216
|
||||
)
|
||||
THEN 0
|
||||
WHEN a.type <> 1
|
||||
THEN a.used_pages
|
||||
WHEN p.index_id < 2
|
||||
THEN a.data_pages
|
||||
ELSE 0
|
||||
END)
|
||||
FROM sys.partitions p
|
||||
INNER JOIN sys.allocation_units a
|
||||
ON p.partition_id = a.container_id
|
||||
LEFT JOIN sys.internal_tables it
|
||||
ON p.object_id = it.object_id
|
||||
) AS partitions'
|
||||
|
||||
|
||||
DECLARE @alldbstate TABLE (
|
||||
|
||||
dbname sysname,
|
||||
DBstatus varchar(55),
|
||||
R_model varchar(30)
|
||||
)
|
||||
|
||||
--select * from sys.master_files
|
||||
|
||||
INSERT INTO @alldbstate (dbname, DBstatus, R_model)
|
||||
SELECT
|
||||
name,
|
||||
CONVERT(varchar(20), DATABASEPROPERTYEX(name, 'status')),
|
||||
recovery_model_desc
|
||||
FROM sys.databases
|
||||
--select * from @dbsize
|
||||
|
||||
INSERT INTO @dbsize (Dbname, dbstatus, Recovery_Model)
|
||||
SELECT
|
||||
dbname,
|
||||
dbstatus,
|
||||
R_model
|
||||
FROM @alldbstate
|
||||
WHERE DBstatus <> 'online'
|
||||
|
||||
INSERT INTO @logsize (Dbname)
|
||||
SELECT
|
||||
dbname
|
||||
FROM @alldbstate
|
||||
WHERE DBstatus <> 'online'
|
||||
|
||||
INSERT INTO @dbfreesize (name)
|
||||
SELECT
|
||||
dbname
|
||||
FROM @alldbstate
|
||||
WHERE DBstatus <> 'online'
|
||||
|
||||
SELECT
|
||||
|
||||
d.Dbname AS [Database Name],
|
||||
d.dbstatus AS [Status],
|
||||
d.Recovery_Model AS [Recovery Mode],
|
||||
(file_size_mb + log_file_size_mb) AS [Total DB Size],
|
||||
fs.Freespace AS [DB Free Space],
|
||||
d.file_Size_MB AS [MDF Size(MB)],
|
||||
d.Space_Used_MB AS [MDF Used(MB)],
|
||||
d.Free_Space_MB AS [MDF Free(MB)],
|
||||
l.Log_File_Size_MB AS [LDF Size (MB)],
|
||||
log_Space_Used_MB AS [LDF Used (MB)],
|
||||
l.log_Free_Space_MB AS [LDF Free (MB)]
|
||||
FROM @dbsize d
|
||||
JOIN @logsize l
|
||||
ON d.Dbname = l.Dbname
|
||||
JOIN @dbfreesize fs
|
||||
ON d.Dbname = fs.name
|
||||
ORDER BY [Database Name] ASC
|
||||
@@ -0,0 +1,198 @@
|
||||
/*************************************************
|
||||
I got this scripts from SQLskills.com
|
||||
writtern by Paul Randal.
|
||||
*************************************************/
|
||||
|
||||
--==========================================--
|
||||
/*** 1. Monitor IO on databases files from
|
||||
the server starting or Database Online ***/
|
||||
--==========================================--
|
||||
|
||||
SELECT
|
||||
[ReadLatency] =
|
||||
CASE
|
||||
WHEN [num_of_reads] = 0 THEN 0
|
||||
ELSE ([io_stall_read_ms] / [num_of_reads])
|
||||
END,
|
||||
[WriteLatency] =
|
||||
CASE
|
||||
WHEN [num_of_writes] = 0 THEN 0
|
||||
ELSE ([io_stall_write_ms] / [num_of_writes])
|
||||
END,
|
||||
[Latency] =
|
||||
CASE
|
||||
WHEN ([num_of_reads] = 0 AND
|
||||
[num_of_writes] = 0) THEN 0
|
||||
ELSE ([io_stall] / ([num_of_reads] + [num_of_writes]))
|
||||
END,
|
||||
[AvgBPerRead] =
|
||||
CASE
|
||||
WHEN [num_of_reads] = 0 THEN 0
|
||||
ELSE ([num_of_bytes_read] / [num_of_reads])
|
||||
END,
|
||||
[AvgBPerWrite] =
|
||||
CASE
|
||||
WHEN [num_of_writes] = 0 THEN 0
|
||||
ELSE ([num_of_bytes_written] / [num_of_writes])
|
||||
END,
|
||||
[AvgBPerTransfer] =
|
||||
CASE
|
||||
WHEN ([num_of_reads] = 0 AND
|
||||
[num_of_writes] = 0) THEN 0
|
||||
ELSE (([num_of_bytes_read] + [num_of_bytes_written]) /
|
||||
([num_of_reads] + [num_of_writes]))
|
||||
END,
|
||||
LEFT([mf].[physical_name], 2) AS [Drive],
|
||||
DB_NAME([vfs].[database_id]) AS [DB],
|
||||
[mf].[physical_name]
|
||||
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS [vfs]
|
||||
JOIN sys.master_files AS [mf]
|
||||
ON [vfs].[database_id] = [mf].[database_id]
|
||||
AND [vfs].[file_id] = [mf].[file_id]
|
||||
-- WHERE [vfs].[file_id] = 2 -- log files
|
||||
-- ORDER BY [Latency] DESC
|
||||
-- ORDER BY [ReadLatency] DESC
|
||||
ORDER BY [WriteLatency] DESC;
|
||||
GO
|
||||
|
||||
|
||||
|
||||
--==========================================--
|
||||
/*** 2. Monitor IO For particular period ***/
|
||||
--==========================================--
|
||||
-- In line 41 you can mention the time period
|
||||
-- ie; WAITFOR DELAY '00:30:00';
|
||||
|
||||
|
||||
IF EXISTS (SELECT
|
||||
*
|
||||
FROM [tempdb].[sys].[objects]
|
||||
WHERE [name] = N'##Stats1')
|
||||
DROP TABLE [##Stats1];
|
||||
|
||||
IF EXISTS (SELECT
|
||||
*
|
||||
FROM [tempdb].[sys].[objects]
|
||||
WHERE [name] = N'##Stats2')
|
||||
DROP TABLE [##Stats2];
|
||||
GO
|
||||
|
||||
SELECT
|
||||
[database_id],
|
||||
[file_id],
|
||||
[num_of_reads],
|
||||
[io_stall_read_ms],
|
||||
[num_of_writes],
|
||||
[io_stall_write_ms],
|
||||
[io_stall],
|
||||
[num_of_bytes_read],
|
||||
[num_of_bytes_written],
|
||||
[file_handle] INTO ##Stats1
|
||||
FROM sys.dm_io_virtual_file_stats(NULL, NULL);
|
||||
GO
|
||||
|
||||
WAITFOR DELAY '00:00:30';
|
||||
GO
|
||||
|
||||
SELECT
|
||||
[database_id],
|
||||
[file_id],
|
||||
[num_of_reads],
|
||||
[io_stall_read_ms],
|
||||
[num_of_writes],
|
||||
[io_stall_write_ms],
|
||||
[io_stall],
|
||||
[num_of_bytes_read],
|
||||
[num_of_bytes_written],
|
||||
[file_handle] INTO ##Stats2
|
||||
FROM sys.dm_io_virtual_file_stats(NULL, NULL);
|
||||
GO
|
||||
|
||||
WITH [DiffLatencies]
|
||||
AS (SELECT
|
||||
-- Files that weren't in the first snapshot
|
||||
[ts2].[database_id],
|
||||
[ts2].[file_id],
|
||||
[ts2].[num_of_reads],
|
||||
[ts2].[io_stall_read_ms],
|
||||
[ts2].[num_of_writes],
|
||||
[ts2].[io_stall_write_ms],
|
||||
[ts2].[io_stall],
|
||||
[ts2].[num_of_bytes_read],
|
||||
[ts2].[num_of_bytes_written]
|
||||
FROM [##Stats2] AS [ts2]
|
||||
LEFT OUTER JOIN [##Stats1] AS [ts1]
|
||||
ON [ts2].[file_handle] = [ts1].[file_handle]
|
||||
WHERE [ts1].[file_handle] IS NULL
|
||||
UNION
|
||||
SELECT
|
||||
-- Diff of latencies in both snapshots
|
||||
[ts2].[database_id],
|
||||
[ts2].[file_id],
|
||||
[ts2].[num_of_reads] - [ts1].[num_of_reads] AS [num_of_reads],
|
||||
[ts2].[io_stall_read_ms] - [ts1].[io_stall_read_ms] AS [io_stall_read_ms],
|
||||
[ts2].[num_of_writes] - [ts1].[num_of_writes] AS [num_of_writes],
|
||||
[ts2].[io_stall_write_ms] - [ts1].[io_stall_write_ms] AS [io_stall_write_ms],
|
||||
[ts2].[io_stall] - [ts1].[io_stall] AS [io_stall],
|
||||
[ts2].[num_of_bytes_read] - [ts1].[num_of_bytes_read] AS [num_of_bytes_read],
|
||||
[ts2].[num_of_bytes_written] - [ts1].[num_of_bytes_written] AS [num_of_bytes_written]
|
||||
FROM [##Stats2] AS [ts2]
|
||||
LEFT OUTER JOIN [##Stats1] AS [ts1]
|
||||
ON [ts2].[file_handle] = [ts1].[file_handle]
|
||||
WHERE [ts1].[file_handle] IS NOT NULL)
|
||||
SELECT
|
||||
DB_NAME([vfs].[database_id]) AS [DB],
|
||||
LEFT([mf].[physical_name], 2) AS [Drive],
|
||||
[mf].[type_desc],
|
||||
[num_of_reads] AS [Reads],
|
||||
[num_of_writes] AS [Writes],
|
||||
[ReadLatency(ms)] =
|
||||
CASE
|
||||
WHEN [num_of_reads] = 0 THEN 0
|
||||
ELSE ([io_stall_read_ms] / [num_of_reads])
|
||||
END,
|
||||
[WriteLatency(ms)] =
|
||||
CASE
|
||||
WHEN [num_of_writes] = 0 THEN 0
|
||||
ELSE ([io_stall_write_ms] / [num_of_writes])
|
||||
END,
|
||||
/*[Latency] =
|
||||
CASE WHEN ([num_of_reads] = 0 AND [num_of_writes] = 0)
|
||||
THEN 0 ELSE ([io_stall] / ([num_of_reads] + [num_of_writes])) END,*/
|
||||
[AvgBPerRead] =
|
||||
CASE
|
||||
WHEN [num_of_reads] = 0 THEN 0
|
||||
ELSE ([num_of_bytes_read] / [num_of_reads])
|
||||
END,
|
||||
[AvgBPerWrite] =
|
||||
CASE
|
||||
WHEN [num_of_writes] = 0 THEN 0
|
||||
ELSE ([num_of_bytes_written] / [num_of_writes])
|
||||
END,
|
||||
/*[AvgBPerTransfer] =
|
||||
CASE WHEN ([num_of_reads] = 0 AND [num_of_writes] = 0)
|
||||
THEN 0 ELSE
|
||||
(([num_of_bytes_read] + [num_of_bytes_written]) /
|
||||
([num_of_reads] + [num_of_writes])) END,*/
|
||||
[mf].[physical_name]
|
||||
FROM [DiffLatencies] AS [vfs]
|
||||
JOIN sys.master_files AS [mf]
|
||||
ON [vfs].[database_id] = [mf].[database_id]
|
||||
AND [vfs].[file_id] = [mf].[file_id]
|
||||
-- ORDER BY [ReadLatency(ms)] DESC
|
||||
ORDER BY [WriteLatency(ms)] DESC;
|
||||
GO
|
||||
|
||||
-- Cleanup
|
||||
IF EXISTS (SELECT
|
||||
*
|
||||
FROM [tempdb].[sys].[objects]
|
||||
WHERE [name] = N'##Stats1')
|
||||
DROP TABLE [##Stats1];
|
||||
|
||||
IF EXISTS (SELECT
|
||||
*
|
||||
FROM [tempdb].[sys].[objects]
|
||||
WHERE [name] = N'##Stats2')
|
||||
DROP TABLE [##Stats2];
|
||||
GO
|
||||
@@ -0,0 +1,320 @@
|
||||
--=========================================--
|
||||
/*** SQL SERVER MEMORY MONITORING QUERIES ***/
|
||||
--=========================================--
|
||||
-- Supported Versions SQL server 2008 and higher
|
||||
-------------------------------------------------
|
||||
|
||||
----------------------------------
|
||||
/*** 1. System Memory Status ***/
|
||||
----------------------------------
|
||||
|
||||
SELECT total_physical_memory_kb / 1024 AS
|
||||
[Total Physical Memory],
|
||||
available_physical_memory_kb / 1024 AS
|
||||
[Available Physical Memory],
|
||||
total_page_file_kb / 1024 AS
|
||||
[Total Page File (MB)],
|
||||
available_page_file_kb / 1024 AS
|
||||
[Available Page File (MB)],
|
||||
100 - ( 100 * Cast(available_physical_memory_kb AS DECIMAL(18, 3)) / Cast
|
||||
(
|
||||
total_physical_memory_kb AS DECIMAL(18, 3)) ) AS
|
||||
'Percentage Used',
|
||||
system_memory_state_desc AS
|
||||
[Memory State]
|
||||
FROM sys.dm_os_sys_memory;
|
||||
|
||||
|
||||
---------------------------------------
|
||||
/*** 2. SQL Server's memory Status ***/
|
||||
---------------------------------------
|
||||
-- this will show how much memory allocated to SQL Server , Buffer pool commit.
|
||||
|
||||
-- SQL server 2008 and earlier
|
||||
|
||||
SELECT
|
||||
(bpool_committed*8)/1024.0 as [Buffer Pool Committed (MB)],
|
||||
(bpool_commit_target*8)/1024.0 as [Buffer Pool Committed Targer (MB)]
|
||||
FROM sys.dm_os_sys_info;
|
||||
|
||||
-- SQL Server 2012 and later
|
||||
|
||||
SELECT
|
||||
(committed_kb)/1024.0 as [Buffer Pool Committed (MB)],
|
||||
(committed_target_kb)/1024.0 as [Buffer Pool Committed Targer (MB)]
|
||||
FROM sys.dm_os_sys_info;
|
||||
|
||||
|
||||
----------------------------------------------
|
||||
/*** 3. Physical Memory Used By SQL Sever***/
|
||||
----------------------------------------------
|
||||
-- Find the actual Memory used by SQL Server
|
||||
|
||||
select
|
||||
convert(decimal (5,2),physical_memory_in_use_kb/1048576.0) AS 'Physical Memory Used By SQL (GB)',
|
||||
convert(decimal (5,2),locked_page_allocations_kb/1048576.0) As 'Locked Page Allocation',
|
||||
convert(decimal (5,2),available_commit_limit_kb/1048576.0) AS 'Available Commit Limit (GB)',
|
||||
page_fault_count as 'Page Fault Count'
|
||||
from sys.dm_os_process_memory;
|
||||
|
||||
------------------------------------------
|
||||
/*** 4. Buffer Pool Usage By Databases ***/
|
||||
------------------------------------------
|
||||
|
||||
DECLARE @total_buffer INT;
|
||||
SELECT @total_buffer = cntr_value
|
||||
FROM sys.dm_os_performance_counters
|
||||
WHERE RTRIM([object_name]) LIKE '%Buffer Manager'
|
||||
AND counter_name = 'Database Pages';
|
||||
|
||||
;WITH DBBuffer AS
|
||||
(
|
||||
SELECT database_id,
|
||||
COUNT_BIG(*) AS db_buffer_pages,
|
||||
SUM (CAST ([free_space_in_bytes] AS BIGINT)) / (1024 * 1024) AS [MBEmpty]
|
||||
FROM sys.dm_os_buffer_descriptors
|
||||
GROUP BY database_id
|
||||
)
|
||||
SELECT
|
||||
CASE [database_id] WHEN 32767 THEN 'Resource DB' ELSE DB_NAME([database_id]) END AS 'DataBase Name',
|
||||
db_buffer_pages AS 'DB Buffer Pages',
|
||||
db_buffer_pages / 128 AS 'DB Buffer Pages Used (MB)',
|
||||
[mbempty] AS 'DB Buffer Pages Free (MB)',
|
||||
CONVERT(DECIMAL(6,3), db_buffer_pages * 100.0 / @total_buffer) AS 'DB Buffer Percentage'
|
||||
FROM DBBuffer
|
||||
ORDER BY [DB Buffer Pages Used (MB)] DESC;
|
||||
|
||||
|
||||
--------------------------------------------
|
||||
/*** 5. Memory Used By Database Objects ***/
|
||||
--------------------------------------------
|
||||
|
||||
;WITH obj_buffer
|
||||
AS (SELECT [Object] = o.NAME,
|
||||
[Type] = o.type_desc,
|
||||
[Index] = COALESCE(i.NAME, ''),
|
||||
[Index_Type] = i.type_desc,
|
||||
p.[object_id],
|
||||
p.index_id,
|
||||
au.allocation_unit_id
|
||||
FROM sys.partitions AS p
|
||||
INNER JOIN sys.allocation_units AS au
|
||||
ON p.hobt_id = au.container_id
|
||||
INNER JOIN sys.objects AS o
|
||||
ON p.[object_id] = o.[object_id]
|
||||
INNER JOIN sys.indexes AS i
|
||||
ON o.[object_id] = i.[object_id]
|
||||
AND p.index_id = i.index_id
|
||||
WHERE au.[type] IN ( 1, 2, 3 )
|
||||
AND o.is_ms_shipped = 0)
|
||||
SELECT obj.[object],
|
||||
obj.[type],
|
||||
obj.[index],
|
||||
obj.index_type,
|
||||
Count_big(b.page_id) AS 'Buffer Pages',
|
||||
Count_big(b.page_id) / 128 AS 'Buffer MB'
|
||||
FROM obj_buffer obj
|
||||
INNER JOIN sys.dm_os_buffer_descriptors AS b
|
||||
ON obj.allocation_unit_id = b.allocation_unit_id
|
||||
WHERE b.database_id = Db_id()
|
||||
GROUP BY obj.[object],
|
||||
obj.[type],
|
||||
obj.[index],
|
||||
obj.index_type
|
||||
ORDER BY [buffer pages] DESC;
|
||||
|
||||
|
||||
----------------------------------------
|
||||
/*** 6. Costliest Stored Procedures ***/
|
||||
----------------------------------------
|
||||
-- Based on Logical reads
|
||||
|
||||
SELECT TOP(25) p.NAME AS [SP Name],
|
||||
qs.total_logical_reads AS
|
||||
[TotalLogicalReads],
|
||||
qs.total_logical_reads / qs.execution_count AS [AvgLogicalReads],
|
||||
qs.execution_count AS 'execution_count',
|
||||
qs.total_elapsed_time AS
|
||||
'total_elapsed_time',
|
||||
qs.total_elapsed_time / qs.execution_count AS 'avg_elapsed_time'
|
||||
,
|
||||
qs.cached_time AS
|
||||
'cached_time'
|
||||
FROM sys.procedures AS p
|
||||
INNER JOIN sys.dm_exec_procedure_stats AS qs
|
||||
ON p.[object_id] = qs.[object_id]
|
||||
WHERE qs.database_id = Db_id()
|
||||
ORDER BY qs.total_logical_reads DESC;
|
||||
|
||||
|
||||
----------------------------------------------
|
||||
/*** 7. Top Performance Counters – Memory ***/
|
||||
----------------------------------------------
|
||||
|
||||
-- Get size of SQL Server Page in bytes
|
||||
DECLARE @pg_size INT,
|
||||
@Instancename VARCHAR(50)
|
||||
|
||||
SELECT @pg_size = low
|
||||
FROM master..spt_values
|
||||
WHERE number = 1
|
||||
AND type = 'E'
|
||||
|
||||
-- Extract perfmon counters to a temporary table
|
||||
IF Object_id('tempdb..#perfmon_counters') IS NOT NULL
|
||||
DROP TABLE #perfmon_counters
|
||||
|
||||
SELECT *
|
||||
INTO #perfmon_counters
|
||||
FROM sys.dm_os_performance_counters;
|
||||
|
||||
-- Get SQL Server instance name as it require for capturing Buffer Cache hit Ratio
|
||||
SELECT @Instancename = LEFT([object_name], ( Charindex(':', [object_name]) ))
|
||||
FROM #perfmon_counters
|
||||
WHERE counter_name = 'Buffer cache hit ratio';
|
||||
|
||||
SELECT *
|
||||
FROM (SELECT 'Total Server Memory (GB)' AS Counter,
|
||||
( cntr_value / 1048576.0 ) AS Value
|
||||
FROM #perfmon_counters
|
||||
WHERE counter_name = 'Total Server Memory (KB)'
|
||||
UNION ALL
|
||||
SELECT 'Target Server Memory (GB)',
|
||||
( cntr_value / 1048576.0 )
|
||||
FROM #perfmon_counters
|
||||
WHERE counter_name = 'Target Server Memory (KB)'
|
||||
UNION ALL
|
||||
SELECT 'Connection Memory (MB)',
|
||||
( cntr_value / 1024.0 )
|
||||
FROM #perfmon_counters
|
||||
WHERE counter_name = 'Connection Memory (KB)'
|
||||
UNION ALL
|
||||
SELECT 'Lock Memory (MB)',
|
||||
( cntr_value / 1024.0 )
|
||||
FROM #perfmon_counters
|
||||
WHERE counter_name = 'Lock Memory (KB)'
|
||||
UNION ALL
|
||||
SELECT 'SQL Cache Memory (MB)',
|
||||
( cntr_value / 1024.0 )
|
||||
FROM #perfmon_counters
|
||||
WHERE counter_name = 'SQL Cache Memory (KB)'
|
||||
UNION ALL
|
||||
SELECT 'Optimizer Memory (MB)',
|
||||
( cntr_value / 1024.0 )
|
||||
FROM #perfmon_counters
|
||||
WHERE counter_name = 'Optimizer Memory (KB) '
|
||||
UNION ALL
|
||||
SELECT 'Granted Workspace Memory (MB)',
|
||||
( cntr_value / 1024.0 )
|
||||
FROM #perfmon_counters
|
||||
WHERE counter_name = 'Granted Workspace Memory (KB) '
|
||||
UNION ALL
|
||||
SELECT 'Cursor memory usage (MB)',
|
||||
( cntr_value / 1024.0 )
|
||||
FROM #perfmon_counters
|
||||
WHERE counter_name = 'Cursor memory usage'
|
||||
AND instance_name = '_Total'
|
||||
UNION ALL
|
||||
SELECT 'Total pages Size (MB)',
|
||||
( cntr_value * @pg_size ) / 1048576.0
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Buffer Manager'
|
||||
AND counter_name = 'Total pages'
|
||||
UNION ALL
|
||||
SELECT 'Database pages (MB)',
|
||||
( cntr_value * @pg_size ) / 1048576.0
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Buffer Manager'
|
||||
AND counter_name = 'Database pages'
|
||||
UNION ALL
|
||||
SELECT 'Free pages (MB)',
|
||||
( cntr_value * @pg_size ) / 1048576.0
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Buffer Manager'
|
||||
AND counter_name = 'Free pages'
|
||||
UNION ALL
|
||||
SELECT 'Reserved pages (MB)',
|
||||
( cntr_value * @pg_size ) / 1048576.0
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Buffer Manager'
|
||||
AND counter_name = 'Reserved pages'
|
||||
UNION ALL
|
||||
SELECT 'Stolen pages (MB)',
|
||||
( cntr_value * @pg_size ) / 1048576.0
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Buffer Manager'
|
||||
AND counter_name = 'Stolen pages'
|
||||
UNION ALL
|
||||
SELECT 'Cache Pages (MB)',
|
||||
( cntr_value * @pg_size ) / 1048576.0
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Plan Cache'
|
||||
AND counter_name = 'Cache Pages'
|
||||
AND instance_name = '_Total'
|
||||
UNION ALL
|
||||
SELECT 'Page Life Expectency in seconds',
|
||||
cntr_value
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Buffer Manager'
|
||||
AND counter_name = 'Page life expectancy'
|
||||
UNION ALL
|
||||
SELECT 'Free list stalls/sec',
|
||||
cntr_value
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Buffer Manager'
|
||||
AND counter_name = 'Free list stalls/sec'
|
||||
UNION ALL
|
||||
SELECT 'Checkpoint pages/sec',
|
||||
cntr_value
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Buffer Manager'
|
||||
AND counter_name = 'Checkpoint pages/sec'
|
||||
UNION ALL
|
||||
SELECT 'Lazy writes/sec',
|
||||
cntr_value
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Buffer Manager'
|
||||
AND counter_name = 'Lazy writes/sec'
|
||||
UNION ALL
|
||||
SELECT 'Memory Grants Pending',
|
||||
cntr_value
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Memory Manager'
|
||||
AND counter_name = 'Memory Grants Pending'
|
||||
UNION ALL
|
||||
SELECT 'Memory Grants Outstanding',
|
||||
cntr_value
|
||||
FROM #perfmon_counters
|
||||
WHERE object_name = @Instancename + 'Memory Manager'
|
||||
AND counter_name = 'Memory Grants Outstanding'
|
||||
UNION ALL
|
||||
SELECT 'process_physical_memory_low',
|
||||
process_physical_memory_low
|
||||
FROM sys.dm_os_process_memory WITH (nolock)
|
||||
UNION ALL
|
||||
SELECT 'process_virtual_memory_low',
|
||||
process_virtual_memory_low
|
||||
FROM sys.dm_os_process_memory WITH (nolock)
|
||||
UNION ALL
|
||||
SELECT 'Max_Server_Memory (MB)',
|
||||
[value_in_use]
|
||||
FROM sys.configurations
|
||||
WHERE [name] = 'max server memory (MB)'
|
||||
UNION ALL
|
||||
SELECT 'Min_Server_Memory (MB)',
|
||||
[value_in_use]
|
||||
FROM sys.configurations
|
||||
WHERE [name] = 'min server memory (MB)'
|
||||
UNION ALL
|
||||
SELECT 'BufferCacheHitRatio',
|
||||
( a.cntr_value * 1.0 / b.cntr_value ) * 100.0
|
||||
FROM sys.dm_os_performance_counters a
|
||||
JOIN (SELECT cntr_value,
|
||||
object_name
|
||||
FROM sys.dm_os_performance_counters
|
||||
WHERE counter_name = 'Buffer cache hit ratio base'
|
||||
AND object_name = @Instancename + 'Buffer Manager')
|
||||
b
|
||||
ON a.object_name = b.object_name
|
||||
WHERE a.counter_name = 'Buffer cache hit ratio'
|
||||
AND a.object_name = @Instancename + 'Buffer Manager') AS D;
|
||||
@@ -0,0 +1,190 @@
|
||||
# SQL-Server
|
||||
|
||||
## Przydatne linki
|
||||
Sporo materiału nie umieszczam celowo ponieważ nie chcę całości utrzymywać ale poniższe linki są bardzo przydatne i korzystam z nich dość często
|
||||
|
||||
[SQL Server - First Responder Kit](https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit)
|
||||
|
||||
[SQL Server Kit](https://github.com/ktaranov/sqlserver-kit)
|
||||
|
||||
[PowerShell Kit](https://github.com/ktaranov/powershell-kit)
|
||||
|
||||
[SQL Stress Test](https://github.com/ErikEJ/SqlQueryStress)
|
||||
|
||||
[SQL Scipts](https://github.com/PavelPawlowski/SQL-Scripts)
|
||||
|
||||
[SQL Server Scripts Kendra](https://github.com/kendalvandyke/SQL-Server-Scripts)
|
||||
|
||||
[SQL Server PowerDoc](https://github.com/kendalvandyke/sqlpowerdoc)
|
||||
|
||||
[sp_whoisactive](https://github.com/amachanic/sp_whoisactive)
|
||||
|
||||
[dbatools](https://github.com/sqlcollaborative/dbatools)
|
||||
|
||||
[dbacheck](https://github.com/sqlcollaborative/dbachecks)
|
||||
|
||||
[JupyterNotebooks](https://github.com/SQLDBAWithABeard/JupyterNotebooks)
|
||||
|
||||
[SQL Server Maintenace Solution Ola Hallengren](https://github.com/olahallengren/sql-server-maintenance-solution)
|
||||
|
||||
[PowerShell tools](https://github.com/janikvonrotz/awesome-powershell)
|
||||
|
||||
|
||||
|
||||
## Oficjalne repozytoria Microsoft
|
||||
|
||||
[TigerBox](https://github.com/microsoft/tigertoolbox)
|
||||
|
||||
[Dokumentacja do SQL Server](https://github.com/MicrosoftDocs/sql-docs)
|
||||
|
||||
|
||||
|
||||
[SQL Server Sample Database](https://github.com/microsoft/sql-server-samples)
|
||||
|
||||
[Reporting Services Tools](https://github.com/microsoft/ReportingServicesTools)
|
||||
|
||||
|
||||
|
||||
|
||||
**Fora internetowe i inne**
|
||||
|
||||
[!!! **Tiger Tollbox ** !!!](https://github.com/Microsoft/tigertoolbox) - oficjalne repozytorium Microsoft SQL Server na GitHub
|
||||
|
||||
[Stack Exchange](https://dba.stackexchange.com/)
|
||||
|
||||
[SQL Server Central](https://www.sqlservercentral.com/)
|
||||
|
||||
[MS SQL Tips](https://www.mssqltips.com/sql-server-dba-resources/)
|
||||
|
||||
[PASS](https://www.pass.org/)
|
||||
|
||||
[Data Community](http://datacommunity.pl/)
|
||||
|
||||
[Microsoft SQL Server Versions List](http://sqlserverbuilds.blogspot.com/)
|
||||
|
||||
**Zasoby GitHub dla SQL Server**
|
||||
|
||||
[SQL Nexus](https://github.com/Microsoft/SqlNexus)
|
||||
|
||||
[SqlCeToolbox](https://github.com/ErikEJ/SqlCeToolbox)
|
||||
|
||||
[SQL Server PowerShell Extensions](https://github.com/MikeShepard/SQLPSX/)
|
||||
|
||||
|
||||
|
||||
**Ci ważniejsi od SQL Servera**
|
||||
|
||||
[SQL WorkBooks](https://sqlworkbooks.com)
|
||||
|
||||
[Brent Ozar](https://www.brentozar.com/)
|
||||
|
||||
[Kendra Little](https://littlekendra.com/)
|
||||
|
||||
[Ola Hallegren](https://ola.hallengren.com)
|
||||
|
||||
[Steve Mogran](https://seniordba.wordpress.com/)
|
||||
|
||||
[Pinal Dave SQL Authority](https://blog.sqlauthority.com/)
|
||||
|
||||
[Ben Miller](https://dbaduck.com/)
|
||||
|
||||
**Przydatne rozwiązania**
|
||||
|
||||
[Narzędzia do migracji i monitorowania **PowerShell**](https://dbatools.io)
|
||||
|
||||
[Opis pól dla Dashbordu Always On](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/use-the-always-on-dashboard-sql-server-management-studio?view=sql-server-2017)
|
||||
|
||||
[First Responder Kit from Brent Ozar](https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/tree/master)
|
||||
|
||||
[SQL Server Maintenance Solution](https://github.com/olahallengren/sql-server-maintenance-solution )
|
||||
|
||||
[PowerShell for the SQL DBA](https://groupby.org/conference-session-abstracts/powershell-for-the-sql-dba/)
|
||||
|
||||
|
||||
|
||||
**MongoDB**
|
||||
[Podstawowe polecenia administracyjne](_pages/mongodb)
|
||||
|
||||
**Zaawanowane szkolenie Olnine by Brent Ozar**
|
||||
|
||||
[DBA Training Plan 1: Build a Server Inventory](https://www.brentozar.com/archive/2019/07/dba-training-plan-1-build-a-server-inventory/)
|
||||
|
||||
[DBA Training Plan 2: Backups (And More Importantly, Restores)](https://www.brentozar.com/archive/2019/07/dba-training-plan-2-backups-and-more-importantly-restores/)
|
||||
|
||||
[DBA Training Plan 3: Treat Your Servers Like Cattle, Not Like Pets](https://www.brentozar.com/archive/2019/07/dba-training-plan-3-automating-restores/ )
|
||||
|
||||
[DBA Training Plan 4: Checking for Corruption](https://www.brentozar.com/archive/2019/07/dba-training-plan-4-checking-for-corruption/)
|
||||
|
||||
[DBA Training Plan 5: Knowing Who Has Access](https://www.brentozar.com/archive/2019/07/dba-training-plan-5-knowing-who-has-access/)
|
||||
|
||||
[DBA Training Plan 6: How to Monitor Drive Space](https://www.brentozar.com/archive/2019/07/dba-training-plan-6-how-to-monitor-drive-space/)
|
||||
|
||||
[DBA Training Plan 7: How SQL Server Stores Stuff in MDF Files](https://www.brentozar.com/archive/2019/07/dba-training-plan-7-how-sql-server-stores-stuff-in-mdf-files/)
|
||||
|
||||
[DBA Training Plan 8: What’s Inside Your Own Databases](https://www.brentozar.com/archive/2019/08/dba-training-plan-8-whats-inside-your-own-databases/)
|
||||
|
||||
[DBA Training Plan 9: My 3 Index Guidelines](https://www.brentozar.com/archive/2019/08/dba-training-plan-9-my-3-index-guidelines/)
|
||||
|
||||
[DBA Training Plan 10: Managing Index Fragmentation](https://www.brentozar.com/archive/2019/08/dba-training-plan-10-managing-index-fragmentation/)
|
||||
|
||||
[DBA Training Plan 11: The Basics of Executing a Query](https://www.brentozar.com/archive/2019/08/dba-training-plan-11-the-basics-of-executing-a-query/)
|
||||
|
||||
[DBA Training Plan 12: What Query Plans Are In Cache?](https://www.brentozar.com/archive/2019/08/dba-training-plan-12-what-query-plans-are-in-cache/)
|
||||
|
||||
[DBA Training Plan 13: Why Do Cached Plans Go Bad?](https://www.brentozar.com/archive/2019/08/dba-training-plan-13-why-do-cached-plans-go-bad/)
|
||||
|
||||
[DBA Training Plan 14: POP QUIZ!](https://www.brentozar.com/archive/2019/08/dba-training-plan-14-pop-quiz/)
|
||||
|
||||
[DBA Training Plan 15: What’s Your SQL Server Waiting On?](https://www.brentozar.com/archive/2019/08/dba-training-plan-15-whats-your-sql-server-waiting-on/)
|
||||
|
||||
[DBA Training Plan 16: Is It Time to Scale Out?](https://www.brentozar.com/archive/2019/08/dba-training-plan-16-is-it-time-to-scale-out/)
|
||||
|
||||
[DBA Training Plan 17: Should You Partition Your Tables?](https://www.brentozar.com/archive/2019/09/dba-training-plan-17-should-you-partition-your-tables/)
|
||||
|
||||
[DBA Training Plan 18: Managing Concurrency](https://www.brentozar.com/archive/2019/09/dba-training-plan-18-managing-concurrency/)
|
||||
|
||||
[DBA Training Plan 19: The L-Word, Licensing](https://www.brentozar.com/archive/2019/09/dba-training-plan-19-the-l-word-licensing/)
|
||||
|
||||
[DBA Training Plan 20: Planning Your Next Server](https://www.brentozar.com/archive/2019/09/dba-training-plan-20-planning-your-next-server/)
|
||||
|
||||
|
||||
**First Responder Kit i więcej**
|
||||
|
||||
|
||||
[Welcome to SQL Server medical school!](https://www.brentozar.com/thanks/welcome-sql-server-medical-school/)
|
||||
|
||||
[How to Do a Free SQL Server Health Check](https://www.brentozar.com/archive/2017/10/free-sql-server-health-check/)
|
||||
|
||||
[How to Do a Free SQL Server Performance Check](https://www.brentozar.com/archive/2017/10/free-sql-server-performance-check/)
|
||||
|
||||
[How to Do a SQL Server Architecture Review](https://www.brentozar.com/archive/2017/10/sql-server-architecture-review/)
|
||||
|
||||
|
||||
**Indeksy**
|
||||
|
||||
[Stairway to SQL Server Indexes](https://www.sqlservercentral.com/stairways/stairway-to-sql-server-indexes)
|
||||
|
||||
[Stairway to Columnstore Indexes](https://www.sqlservercentral.com/stairways/stairway-to-columnstore-indexes)
|
||||
|
||||
[Indexing on Brent Ozar](https://www.brentozar.com/archive/category/indexing/)
|
||||
|
||||
[Are My SQL Server Indexes Being Used?](https://www.sqlservercentral.com/blogs/are-my-sql-server-indexes-being-used)
|
||||
|
||||
**Tabele**
|
||||
|
||||
[How to Update SQL Server Statistics for Big Tables](https://codingsight.com/how-to-update-sql-server-statistics-for-big-tables/)
|
||||
|
||||
|
||||
**Performance**
|
||||
|
||||
[SQL Server Database Activity Based on Transaction Log Backup Size](https://www.mssqltips.com/sqlservertip/6096/sql-server-database-activity-based-on-transaction-log-backup-size/)
|
||||
|
||||
**Bezpieczeństwo**
|
||||
|
||||
[Stairway to SQL Server Security Level 1: Overview of SQL Server Security](https://www.sqlservercentral.com/steps/stairway-to-sql-server-security-level-1-overview-of-sql-server-security)
|
||||
|
||||
===========
|
||||
1. index - skrypty dotyczące indeksów, statystyk i sprawdzania wydajności
|
||||
|
||||
Skrypt który pokazuje brakjące indeksów w bazach
|
||||
https://www.mssqltips.com/sqlservertip/1237/finding-primary-keys-and-missing-primary-keys-in-sql-server/
|
||||
@@ -0,0 +1,57 @@
|
||||
/********************************************************************************************
|
||||
|
||||
*** Session Momitoring using sp_whoisactive ***
|
||||
------------------------------------------------
|
||||
|
||||
I have prepared this script to monitor currently running sessions
|
||||
in different scenarios like CPU, Blocking, So first you need to
|
||||
create sp_whoisactive stored procedure, please downad it from the link,
|
||||
|
||||
https://github.com/SqlAdmin/AwesomeSQLServer/blob/master/T-SQL%20Scripts/sp_whoisactive.sql
|
||||
|
||||
*******************************************************************************************/
|
||||
|
||||
|
||||
-- To get overall info about current sessions
|
||||
|
||||
EXEC sp_whoisactive
|
||||
|
||||
|
||||
------------------------------------------------
|
||||
/*** 1. Currently running sessions CPU time ***/
|
||||
------------------------------------------------
|
||||
|
||||
EXEC sp_WhoIsActive @get_plans = 1,
|
||||
@get_avg_time = 1,
|
||||
@output_column_list = '[dd%][session_id][database_name][cpu%][sql_text]',
|
||||
@sort_order = '[start_time] ASC'
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
/*** 2. Currently running sessions memory pages usage ***/
|
||||
-----------------------------------------------------------
|
||||
|
||||
EXEC sp_WhoIsActive @output_column_list = '[dd%][session_id][database_name][sql_text][used_memory][tempdb_allocations][tempdb_current]',
|
||||
@sort_order = '[start_time] ASC';
|
||||
|
||||
|
||||
--------------------------------------------------------------
|
||||
/*** 3. Currently running query, batch and execution plan ***/
|
||||
--------------------------------------------------------------
|
||||
|
||||
EXEC sp_WhoIsActive @get_full_inner_text = 1,
|
||||
@get_plans = 1,
|
||||
@get_outer_command = 1,
|
||||
@output_column_list = '[dd%][session_id][database_name][sql_text][sql_command][query_plan]',
|
||||
@sort_order = '[start_time] ASC';
|
||||
|
||||
|
||||
-----------------------------------------------------------------
|
||||
/*** 4. Monitor Transaction log writing process of a session ***/
|
||||
-----------------------------------------------------------------
|
||||
|
||||
EXEC sp_WhoIsActive @get_transaction_info = 1,
|
||||
@output_column_list = '[dd%][session_id][database_name][tran_log_writes]',
|
||||
@sort_order = '[start_time] ASC';
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
select *
|
||||
from (
|
||||
SELECT sp.stats_id, name, filter_definition, last_updated, rows, rows_sampled, steps, unfiltered_rows, modification_counter
|
||||
, stat.object_id
|
||||
FROM sys.stats AS stat
|
||||
CROSS APPLY sys.dm_db_stats_properties(stat.object_id, stat.stats_id) AS sp) x
|
||||
inner join sys.objects obj on x.object_id = obj.object_id
|
||||
where obj.type = 'U'
|
||||
order by last_updated desc
|
||||
|
||||
|
||||
SELECT sp.stats_id, name, filter_definition, last_updated, rows, rows_sampled, steps, unfiltered_rows, modification_counter
|
||||
, stat.object_id
|
||||
FROM sys.stats AS stat
|
||||
CROSS APPLY sys.dm_db_stats_properties(stat.object_id, stat.stats_id) AS sp
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,184 @@
|
||||
/**********************************************
|
||||
Monitoring Wait stats
|
||||
***********************************************/
|
||||
|
||||
--========================================--
|
||||
/*** 1. Monitor Current sessions wait ***/
|
||||
--========================================--
|
||||
|
||||
|
||||
SELECT
|
||||
dm_ws.wait_duration_ms,
|
||||
dm_ws.wait_type,
|
||||
dm_es.status,
|
||||
dm_t.TEXT,
|
||||
dm_qp.query_plan,
|
||||
dm_ws.session_ID,
|
||||
dm_es.cpu_time,
|
||||
dm_es.memory_usage,
|
||||
dm_es.logical_reads,
|
||||
dm_es.total_elapsed_time,
|
||||
dm_es.program_name,
|
||||
DB_NAME(dm_r.database_id) DatabaseName,
|
||||
-- Optional columns
|
||||
dm_ws.blocking_session_id,
|
||||
dm_r.wait_resource,
|
||||
dm_es.login_name,
|
||||
dm_r.command,
|
||||
dm_r.last_wait_type
|
||||
FROM sys.dm_os_waiting_tasks dm_ws
|
||||
INNER JOIN sys.dm_exec_requests dm_r
|
||||
ON dm_ws.session_id = dm_r.session_id
|
||||
INNER JOIN sys.dm_exec_sessions dm_es
|
||||
ON dm_es.session_id = dm_r.session_id
|
||||
CROSS APPLY sys.dm_exec_sql_text(dm_r.sql_handle) dm_t
|
||||
CROSS APPLY sys.dm_exec_query_plan(dm_r.plan_handle) dm_qp
|
||||
WHERE dm_es.is_user_process = 1
|
||||
GO
|
||||
|
||||
--===========================================--
|
||||
/*** 2. Monior waits for a specific period ***/
|
||||
--===========================================--
|
||||
|
||||
-- Got this from SQLskills.com
|
||||
-- You can set the time limit in > WAITFOR DELAY '00:30:00';
|
||||
|
||||
IF EXISTS (SELECT
|
||||
*
|
||||
FROM [tempdb].[sys].[objects]
|
||||
WHERE [name] = N'##SQLskillsStats1')
|
||||
DROP TABLE [##SQLskillsStats1];
|
||||
|
||||
IF EXISTS (SELECT
|
||||
*
|
||||
FROM [tempdb].[sys].[objects]
|
||||
WHERE [name] = N'##SQLskillsStats2')
|
||||
DROP TABLE [##SQLskillsStats2];
|
||||
GO
|
||||
|
||||
SELECT
|
||||
[wait_type],
|
||||
[waiting_tasks_count],
|
||||
[wait_time_ms],
|
||||
[max_wait_time_ms],
|
||||
[signal_wait_time_ms] INTO ##SQLskillsStats1
|
||||
FROM sys.dm_os_wait_stats;
|
||||
GO
|
||||
|
||||
WAITFOR DELAY '00:30:00';
|
||||
GO
|
||||
|
||||
SELECT
|
||||
[wait_type],
|
||||
[waiting_tasks_count],
|
||||
[wait_time_ms],
|
||||
[max_wait_time_ms],
|
||||
[signal_wait_time_ms] INTO ##SQLskillsStats2
|
||||
FROM sys.dm_os_wait_stats;
|
||||
GO
|
||||
|
||||
WITH [DiffWaits]
|
||||
AS (SELECT
|
||||
-- Waits that weren't in the first snapshot
|
||||
[ts2].[wait_type],
|
||||
[ts2].[wait_time_ms],
|
||||
[ts2].[signal_wait_time_ms],
|
||||
[ts2].[waiting_tasks_count]
|
||||
FROM [##SQLskillsStats2] AS [ts2]
|
||||
LEFT OUTER JOIN [##SQLskillsStats1] AS [ts1]
|
||||
ON [ts2].[wait_type] = [ts1].[wait_type]
|
||||
WHERE [ts1].[wait_type] IS NULL
|
||||
AND [ts2].[wait_time_ms] > 0
|
||||
UNION
|
||||
SELECT
|
||||
-- Diff of waits in both snapshots
|
||||
[ts2].[wait_type],
|
||||
[ts2].[wait_time_ms] - [ts1].[wait_time_ms] AS [wait_time_ms],
|
||||
[ts2].[signal_wait_time_ms] - [ts1].[signal_wait_time_ms] AS [signal_wait_time_ms],
|
||||
[ts2].[waiting_tasks_count] - [ts1].[waiting_tasks_count] AS [waiting_tasks_count]
|
||||
FROM [##SQLskillsStats2] AS [ts2]
|
||||
LEFT OUTER JOIN [##SQLskillsStats1] AS [ts1]
|
||||
ON [ts2].[wait_type] = [ts1].[wait_type]
|
||||
WHERE [ts1].[wait_type] IS NOT NULL
|
||||
AND [ts2].[waiting_tasks_count] - [ts1].[waiting_tasks_count] > 0
|
||||
AND [ts2].[wait_time_ms] - [ts1].[wait_time_ms] > 0),
|
||||
[Waits]
|
||||
AS (SELECT
|
||||
[wait_type],
|
||||
[wait_time_ms] / 1000.0 AS [WaitS],
|
||||
([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],
|
||||
[signal_wait_time_ms] / 1000.0 AS [SignalS],
|
||||
[waiting_tasks_count] AS [WaitCount],
|
||||
100.0 * [wait_time_ms] / SUM([wait_time_ms]) OVER () AS [Percentage],
|
||||
ROW_NUMBER() OVER (ORDER BY [wait_time_ms] DESC) AS [RowNum]
|
||||
FROM [DiffWaits]
|
||||
WHERE [wait_type] NOT IN (
|
||||
N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR',
|
||||
N'BROKER_TASK_STOP', N'BROKER_TO_FLUSH',
|
||||
N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE',
|
||||
N'CHKPT', N'CLR_AUTO_EVENT',
|
||||
N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE',
|
||||
N'DBMIRROR_DBM_EVENT', N'DBMIRROR_EVENTS_QUEUE',
|
||||
N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD',
|
||||
N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE',
|
||||
N'EXECSYNC', N'FSAGENT',
|
||||
N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX',
|
||||
N'HADR_CLUSAPI_CALL', N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
|
||||
N'HADR_LOGCAPTURE_WAIT', N'HADR_NOTIFICATION_DEQUEUE',
|
||||
N'HADR_TIMER_TASK', N'HADR_WORK_QUEUE',
|
||||
N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP',
|
||||
N'LOGMGR_QUEUE', N'ONDEMAND_TASK_QUEUE',
|
||||
N'PWAIT_ALL_COMPONENTS_INITIALIZED',
|
||||
N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP',
|
||||
N'QDS_SHUTDOWN_QUEUE',
|
||||
N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP',
|
||||
N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE',
|
||||
N'SERVER_IDLE_CHECK', N'SLEEP_BPOOL_FLUSH',
|
||||
N'SLEEP_DBSTARTUP', N'SLEEP_DCOMSTARTUP',
|
||||
N'SLEEP_MASTERDBREADY', N'SLEEP_MASTERMDREADY',
|
||||
N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP',
|
||||
N'SLEEP_SYSTEMTASK', N'SLEEP_TASK',
|
||||
N'SLEEP_TEMPDBSTARTUP', N'SNI_HTTP_ACCEPT',
|
||||
N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH',
|
||||
N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
|
||||
N'SQLTRACE_WAIT_ENTRIES', N'WAIT_FOR_RESULTS',
|
||||
N'WAITFOR', N'WAITFOR_TASKSHUTDOWN',
|
||||
N'WAIT_XTP_HOST_WAIT', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG',
|
||||
N'WAIT_XTP_CKPT_CLOSE', N'XE_DISPATCHER_JOIN',
|
||||
N'XE_DISPATCHER_WAIT', N'XE_TIMER_EVENT'))
|
||||
SELECT
|
||||
[W1].[wait_type] AS [WaitType],
|
||||
CAST([W1].[WaitS] AS decimal(16, 2)) AS [Wait_S],
|
||||
CAST([W1].[ResourceS] AS decimal(16, 2)) AS [Resource_S],
|
||||
CAST([W1].[SignalS] AS decimal(16, 2)) AS [Signal_S],
|
||||
[W1].[WaitCount] AS [WaitCount],
|
||||
CAST([W1].[Percentage] AS decimal(5, 2)) AS [Percentage],
|
||||
CAST(([W1].[WaitS] / [W1].[WaitCount]) AS decimal(16, 4)) AS [AvgWait_S],
|
||||
CAST(([W1].[ResourceS] / [W1].[WaitCount]) AS decimal(16, 4)) AS [AvgRes_S],
|
||||
CAST(([W1].[SignalS] / [W1].[WaitCount]) AS decimal(16, 4)) AS [AvgSig_S]
|
||||
FROM [Waits] AS [W1]
|
||||
INNER JOIN [Waits] AS [W2]
|
||||
ON [W2].[RowNum] <= [W1].[RowNum]
|
||||
GROUP BY [W1].[RowNum],
|
||||
[W1].[wait_type],
|
||||
[W1].[WaitS],
|
||||
[W1].[ResourceS],
|
||||
[W1].[SignalS],
|
||||
[W1].[WaitCount],
|
||||
[W1].[Percentage]
|
||||
HAVING SUM([W2].[Percentage]) - [W1].[Percentage] < 95; -- percentage threshold
|
||||
GO
|
||||
|
||||
-- Cleanup
|
||||
IF EXISTS (SELECT
|
||||
*
|
||||
FROM [tempdb].[sys].[objects]
|
||||
WHERE [name] = N'##SQLskillsStats1')
|
||||
DROP TABLE [##SQLskillsStats1];
|
||||
|
||||
IF EXISTS (SELECT
|
||||
*
|
||||
FROM [tempdb].[sys].[objects]
|
||||
WHERE [name] = N'##SQLskillsStats2')
|
||||
DROP TABLE [##SQLskillsStats2];
|
||||
GO
|
||||
@@ -0,0 +1,13 @@
|
||||
Use the below query to get details for all emails sent the same date:
|
||||
SELECT * FROM msdb..sysmail_mailitems WHERE sent_date > DATEADD(DAY, -1,GETDATE())
|
||||
And here is the complete query to get all the failed emails from the past 24 hours:
|
||||
SELECT items.subject ,
|
||||
items.recipients ,
|
||||
items.copy_recipients ,
|
||||
items.blind_copy_recipients ,
|
||||
items.last_mod_date ,
|
||||
l.description
|
||||
FROM msdb.dbo.sysmail_faileditems AS items
|
||||
LEFT OUTER JOIN msdb.dbo.sysmail_event_log AS l
|
||||
ON items.mailitem_id = l.mailitem_id
|
||||
WHERE items.last_mod_date > DATEADD(DAY, -1,GETDATE())
|
||||
@@ -0,0 +1,132 @@
|
||||
;WITH LAST_FULL_BACKUP_LIST AS
|
||||
(
|
||||
SELECT
|
||||
SYSDBLIST.name AS Name,
|
||||
MAX(BUSETS.backup_finish_date) AS Last_Backup_Finish_DateTime
|
||||
FROM
|
||||
MASTER.sys.databases AS SYSDBLIST
|
||||
LEFT OUTER JOIN
|
||||
msdb.dbo.backupset AS BUSETS
|
||||
ON
|
||||
SYSDBLIST.name = BUSETS.database_name
|
||||
WHERE
|
||||
SYSDBLIST.name<>'tempdb'
|
||||
AND
|
||||
BUSETS.[type] ='D' OR BUSETS.[type] IS NULL
|
||||
GROUP BY
|
||||
SYSDBLIST.name
|
||||
)
|
||||
,
|
||||
LAST_DIFFERENTIAL_BACKUP_LIST
|
||||
AS
|
||||
(
|
||||
SELECT
|
||||
SYSDBLIST.name AS Name,
|
||||
MAX(BUSETS.backup_finish_date) AS Last_Backup_Finish_DateTime
|
||||
FROM
|
||||
MASTER.sys.databases AS SYSDBLIST
|
||||
LEFT OUTER JOIN
|
||||
msdb.dbo.backupset AS BUSETS
|
||||
ON
|
||||
SYSDBLIST.name = BUSETS.database_name
|
||||
WHERE
|
||||
SYSDBLIST.name<>'TempDB'
|
||||
AND
|
||||
BUSETS.[type] ='I'
|
||||
GROUP BY
|
||||
SYSDBLIST.name
|
||||
)
|
||||
|
||||
,
|
||||
|
||||
LOG_BACKUP_LIST
|
||||
AS
|
||||
(
|
||||
SELECT
|
||||
SYSDBLIST.name AS Name,
|
||||
BUSETS.backup_finish_date AS Backup_Finish_DateTime,
|
||||
ROUND(((BUSETS.backup_size/1024)/1024),2) AS Backup_Size_MB,
|
||||
ROW_NUMBER() OVER(Partition by SYSDBLIST.name ORDER BY BUSETS.backup_finish_date DESC) AS RevOrderBuDate
|
||||
FROM
|
||||
MASTER.sys.databases AS SYSDBLIST
|
||||
LEFT OUTER JOIN
|
||||
msdb.dbo.backupset AS BUSETS
|
||||
ON
|
||||
SYSDBLIST.name = BUSETS.database_name
|
||||
WHERE
|
||||
SYSDBLIST.name<>'TempDB'
|
||||
AND
|
||||
BUSETS.[type] ='L'
|
||||
)
|
||||
,
|
||||
LAST_LOG_BACKUP_LIST
|
||||
AS
|
||||
(SELECT
|
||||
Name,
|
||||
Backup_Finish_DateTime AS Last_Backup_Finish_DateTime,
|
||||
Backup_Size_MB AS Log_Backup_Size_MB
|
||||
FROM
|
||||
LOG_BACKUP_LIST
|
||||
WHERE
|
||||
RevOrderBuDate=1
|
||||
)
|
||||
SELECT
|
||||
case
|
||||
when DATEDIFF(DAY,BUSETS.backup_finish_date,GETDATE()) <=1 then 'OK'
|
||||
when DATEDIFF(DAY,BUSETS.backup_finish_date,GETDATE()) is null then 'ERROR'
|
||||
when DATEDIFF(DAY,BUSETS.backup_finish_date,GETDATE()) > 3 then '!!'
|
||||
when DATEDIFF(DAY,BUSETS.backup_finish_date,GETDATE()) > 1 then '-->'
|
||||
end as Status,
|
||||
SERVERPROPERTY('Servername') AS ServerName,
|
||||
SYSDBLIST.name AS Database_Name,
|
||||
SYSDBLIST.Recovery_model_desc,
|
||||
CASE WHEN BUSETS.backup_set_id IS NULL THEN 'NO Backup' ELSE 'Backup Complete' END AS Backup_Completed,
|
||||
BUSETS.backup_start_date AS Backup_Start_DateTime,
|
||||
BUSETS.backup_finish_date AS Backup_Finish_DateTime,
|
||||
DATEDIFF(MINUTE, BUSETS.backup_start_date, BUSETS.backup_finish_date) AS Duration_Min,
|
||||
(DATEDIFF(DAY,BUSETS.backup_finish_date,GETDATE())) AS Days_Since_Last_Backup,
|
||||
|
||||
LASTDIFFBACKUP.Last_Backup_Finish_DateTime AS Last_Differential_Finish_DateTime,
|
||||
(DATEDIFF(DAY,LASTDIFFBACKUP.Last_Backup_Finish_DateTime ,GETDATE())) AS Days_Since_Last_Differential_Backup,
|
||||
LASTLOGBACKUP.Last_Backup_Finish_DateTime AS Last_Log_Finish_DateTime,
|
||||
(DATEDIFF(DAY,LASTLOGBACKUP.Last_Backup_Finish_DateTime,GETDATE()))AS Days_Since_Last_Log_Backup,
|
||||
LASTLOGBACKUP.Log_Backup_Size_MB AS LOG_Backup_Size_MB,
|
||||
CASE
|
||||
WHEN BUSETS.[type] = 'D' THEN 'Full Backup'
|
||||
WHEN BUSETS.[type] = 'I' THEN 'Differential Database'
|
||||
WHEN BUSETS.[type] = 'L' THEN 'Log'
|
||||
WHEN BUSETS.[type] = 'F' THEN 'File/Filegroup'
|
||||
WHEN BUSETS.[type] = 'G' THEN 'Differential File'
|
||||
WHEN BUSETS.[type] = 'P' THEN 'Partial'
|
||||
WHEN BUSETS.[type] = 'Q'THEN 'Differential partial'
|
||||
END AS Backup_Type,
|
||||
ROUND(((BUSETS.backup_size/1024)/1024),2) AS Backup_Size_MB
|
||||
FROM
|
||||
MASTER.sys.databases AS SYSDBLIST
|
||||
LEFT OUTER JOIN
|
||||
msdb.dbo.backupset AS BUSETS
|
||||
ON
|
||||
SYSDBLIST.name = BUSETS.database_name
|
||||
LEFT OUTER JOIN
|
||||
msdb.dbo.backupmediafamily AS BUMEDFAM
|
||||
ON
|
||||
BUSETS.media_set_id = BUMEDFAM.media_set_id
|
||||
|
||||
INNER JOIN
|
||||
LAST_FULL_BACKUP_LIST AS LASTBACKUP
|
||||
ON
|
||||
SYSDBLIST.Name=LASTBACKUP.Name
|
||||
AND
|
||||
ISNULL(BUSETS.backup_finish_date,'01/01/1900') = ISNULL(LASTBACKUP. Last_Backup_Finish_DateTime,'01/01/1900')
|
||||
|
||||
LEFT OUTER JOIN
|
||||
LAST_DIFFERENTIAL_BACKUP_LIST AS LASTDIFFBACKUP
|
||||
ON
|
||||
SYSDBLIST.Name=LASTDIFFBACKUP.Name
|
||||
|
||||
LEFT OUTER JOIN
|
||||
LAST_LOG_BACKUP_LIST AS LASTLOGBACKUP
|
||||
ON
|
||||
SYSDBLIST.Name=LASTLOGBACKUP.Name
|
||||
WHERE
|
||||
SYSDBLIST.name<>'TempDB'
|
||||
@@ -0,0 +1,49 @@
|
||||
SET NOCOUNT ON
|
||||
GO
|
||||
SET quoted_identifier OFF
|
||||
DECLARE @dbname AS VARCHAR(80)
|
||||
DECLARE @msgdb AS VARCHAR(100)
|
||||
DECLARE @dbbkpname AS VARCHAR(80)
|
||||
DECLARE @dypart1 AS VARCHAR(2)
|
||||
DECLARE @dypart2 AS VARCHAR(3)
|
||||
DECLARE @dypart3 AS VARCHAR(4)
|
||||
DECLARE @currentdate AS VARCHAR(10)
|
||||
DECLARE @server_name AS VARCHAR(30)
|
||||
SELECT @server_name = @@servername
|
||||
SELECT @dypart1 = DATEPART(dd,GETDATE())
|
||||
SELECT @dypart2 = DATENAME(mm,GETDATE())
|
||||
SELECT @dypart3 = DATEPART(yy,GETDATE())
|
||||
SELECT @currentdate= @dypart1 + @dypart2 + @dypart3
|
||||
PRINT "#####################################################################"
|
||||
PRINT "# SERVERNAME : "+ @server_name + " DATE : "+ @currentdate +"#"
|
||||
PRINT "#####################################################################"
|
||||
PRINT "DatabaseName Full Diff TranLog"
|
||||
PRINT "##########################################################################################################################################"
|
||||
SELECT SUBSTRING(s.name,1,50) AS 'DATABASE Name',
|
||||
b.backup_start_date AS 'Full DB Backup Status',
|
||||
c.backup_start_date AS 'Differential DB Backup Status',
|
||||
d.backup_start_date AS 'Transaction Log Backup Status'
|
||||
FROM MASTER..sysdatabases s
|
||||
LEFT OUTER JOIN msdb..backupset b
|
||||
ON s.name = b.database_name
|
||||
AND b.backup_start_date =
|
||||
(SELECT MAX(backup_start_date)AS 'Full DB Backup Status'
|
||||
FROM msdb..backupset
|
||||
WHERE database_name = b.database_name
|
||||
AND TYPE = 'D') -- full database backups only, not log backups
|
||||
LEFT OUTER JOIN msdb..backupset c
|
||||
ON s.name = c.database_name
|
||||
AND c.backup_start_date =
|
||||
(SELECT MAX(backup_start_date)'Differential DB Backup Status'
|
||||
FROM msdb..backupset
|
||||
WHERE database_name = c.database_name
|
||||
AND TYPE = 'I')
|
||||
LEFT OUTER JOIN msdb..backupset d
|
||||
ON s.name = d.database_name
|
||||
AND d.backup_start_date =
|
||||
(SELECT MAX(backup_start_date)'Transaction Log Backup Status'
|
||||
FROM msdb..backupset
|
||||
WHERE database_name = d.database_name
|
||||
AND TYPE = 'L')
|
||||
WHERE s.name <>'tempdb'
|
||||
ORDER BY s.name
|
||||
@@ -0,0 +1,9 @@
|
||||
select
|
||||
a.name, b.total_elapsed_time/60000 as [Running time],
|
||||
b.estimated_completion_time/60000 as [Remaining],
|
||||
b.percent_complete as [%],
|
||||
(select text from sys.dm_exec_sql_text(b.sql_handle)) as command,
|
||||
b.wait_type
|
||||
from master..sysdatabases a, sys.dm_exec_requests b
|
||||
where a.dbid=b.database_id and b.command like '%BACKUP%'
|
||||
order by percent_complete desc, b.total_elapsed_time/60000 desc
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
select scheduler_id,cpu_id, status, is_online from sys.dm_os_schedulers where status='VISIBLE ONLINE'
|
||||
@@ -0,0 +1,571 @@
|
||||
---------------------------------------------------------------------------------
|
||||
-- The sample scripts are not supported under any Microsoft standard support
|
||||
-- program or service. The sample scripts are provided AS IS without warranty
|
||||
-- of any kind. Microsoft further disclaims all implied warranties including,
|
||||
-- without limitation, any implied warranties of merchantability or of fitness for
|
||||
-- a particular purpose. The entire risk arising out of the use or performance of
|
||||
-- the sample scripts and documentation remains with you. In no event shall
|
||||
-- Microsoft, its authors, or anyone else involved in the creation, production, or
|
||||
-- delivery of the scripts be liable for any damages whatsoever (including,
|
||||
-- without limitation, damages for loss of business profits, business interruption,
|
||||
-- loss of business information, or other pecuniary loss) arising out of the use
|
||||
-- of or inability to use the sample scripts or documentation, even if Microsoft
|
||||
-- has been advised of the possibility of such damages
|
||||
|
||||
-- The script is not compatible with SQL Server 2000 and SQL Server 2005, please upgrade your SQL Server to newer edition.
|
||||
---------------------------------------------------------------------------------
|
||||
|
||||
DECLARE @ProductVersion NVARCHAR(20)
|
||||
DECLARE @ProductLevel NVARCHAR(20)
|
||||
DECLARE @UpdateLevel NVARCHAR(20)
|
||||
DECLARE @UpdateRef NVARCHAR(20)
|
||||
DECLARE @UpdateRefOutput NVARCHAR(200) = ''
|
||||
DECLARE @Edition NVARCHAR(100)
|
||||
|
||||
DECLARE @ProductName NVARCHAR(30)
|
||||
DECLARE @TheLastVersion NVARCHAR(100)
|
||||
DECLARE @OtherProduct NVARCHAR(800)
|
||||
DECLARE @SPInfo NVARCHAR(400)
|
||||
DECLARE @CUInfo NVARCHAR(400)
|
||||
|
||||
DECLARE @CumulativeUpdate NVARCHAR(20)
|
||||
DECLARE @CumulativeUpdateKB NVARCHAR(100)
|
||||
DECLARE @EditionID sql_variant
|
||||
|
||||
DECLARE @ExtendedSupport NVARCHAR(500)
|
||||
DECLARE @MainSupportNonUpdate NVARCHAR(500)
|
||||
DECLARE @MainSupport NVARCHAR(500)
|
||||
|
||||
|
||||
DECLARE @2016E NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Enterprise'
|
||||
DECLARE @2016BI NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Business Intelligence'
|
||||
DECLARE @2016Std NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Standard'
|
||||
DECLARE @2016Web NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Web'
|
||||
DECLARE @2016Exp NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Express'
|
||||
DECLARE @2016Dev NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Developer'
|
||||
DECLARE @2016Eval NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Evaluation'
|
||||
|
||||
DECLARE @2014E NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Enterprise'
|
||||
DECLARE @2014BI NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Business Intelligence'
|
||||
DECLARE @2014Std NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Standard'
|
||||
DECLARE @2014Web NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Web'
|
||||
DECLARE @2014Exp NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Express'
|
||||
DECLARE @2014Dev NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Developer'
|
||||
|
||||
DECLARE @2012E NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Enterprise'
|
||||
DECLARE @2012BI NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Business Intelligence'
|
||||
DECLARE @2012Std NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Standard'
|
||||
DECLARE @2012Web NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Web'
|
||||
DECLARE @2012Exp NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Express'
|
||||
DECLARE @2012Dev NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Developer'
|
||||
|
||||
DECLARE @2008R2E NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Enterprise'
|
||||
DECLARE @2008R2Dat NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Datacenter'
|
||||
DECLARE @2008R2Std NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Standard'
|
||||
DECLARE @2008R2Wg NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Workgroup'
|
||||
DECLARE @2008R2Dev NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Developer'
|
||||
DECLARE @2008R2ExpAdv NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Express with Advanced'
|
||||
|
||||
DECLARE @2008E NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 Enterprise'
|
||||
DECLARE @2008Std NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 Standard'
|
||||
DECLARE @2008Wg NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 Workgroup'
|
||||
DECLARE @2008Dev NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 Developer'
|
||||
DECLARE @2008ExpAdv NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 Express with Advanced'
|
||||
|
||||
SET @ExtendedSupport = 'Support Lifecycle stage: Extended Support Phase. For additional information refer to '
|
||||
+ CHAR(13) + 'https://support.microsoft.com/en-us/lifecycle/search?sort=PN&alpha=SQL%20Server&Filter=FilterNO, and Q6, Q18'
|
||||
+ CHAR(13) + 'in the FAQ section of Support Lifecycle page at: https://support.microsoft.com/en-us/lifecycle#gp/lifePolicy'
|
||||
|
||||
SET @MainSupportNonUpdate = 'Support Lifecycle stage: Mainstream Support Phase, however security/non-security updates are not available for'
|
||||
+ CHAR(13) + 'current 2012 baseline. Upgrade to SP2 for security/Non-security updates. For additional information refer to:'
|
||||
+ CHAR(13) + 'https://support.microsoft.com/en-us/lifecycle/search?sort=PN&alpha=SQL%20Server&Filter=FilterNO, and Q6, Q18'
|
||||
+ CHAR(13) + 'in the FAQ section of Support Lifecycle page at: https://support.microsoft.com/en-us/lifecycle#gp/lifePolicy'
|
||||
|
||||
SET @MainSupport = 'Support Lifecycle stage: Mainstream Support Phase. For additional information refer to '
|
||||
+ CHAR(13) + 'https://support.microsoft.com/en-us/lifecycle/search?sort=PN&alpha=SQL%20Server&Filter=FilterNO, and Q6, Q18'
|
||||
+ CHAR(13) + 'in the FAQ section of Support Lifecycle page at: https://support.microsoft.com/en-us/lifecycle#gp/lifePolicy'
|
||||
|
||||
SET @EditionID = SERVERPROPERTY('EditionID')
|
||||
SET @ProductVersion = CONVERT(NVARCHAR(20),SERVERPROPERTY('ProductVersion'))
|
||||
SET @ProductLevel = CONVERT(NVARCHAR(20),SERVERPROPERTY('ProductLevel'))
|
||||
SET @UpdateLevel = ISNULL(CONVERT(NVARCHAR(20),SERVERPROPERTY('ProductUpdateLevel')),'')
|
||||
SET @UpdateRef = ISNULL(CONVERT(NVARCHAR(20),SERVERPROPERTY('@UpdateRef')),'')
|
||||
SET @Edition = CONVERT(NVARCHAR(100),SERVERPROPERTY('Edition'))
|
||||
|
||||
SELECT @ProductName =
|
||||
CASE SUBSTRING(@ProductVersion,1,4)
|
||||
WHEN '13.0' THEN 'SQL Server 2016'
|
||||
WHEN '12.0' THEN 'SQL Server 2014'
|
||||
WHEN '11.0' THEN 'SQL Server 2012'
|
||||
WHEN '10.5' THEN 'SQL Server 2008 R2'
|
||||
WHEN '10.0' THEN 'SQL Server 2008'
|
||||
END,
|
||||
@TheLastVersion =
|
||||
CASE SUBSTRING(@ProductVersion,1,4)
|
||||
WHEN '13.0' THEN 'SQL Server 2016 RTM'
|
||||
WHEN '12.0' THEN 'SQL Server 2014 SP2'
|
||||
WHEN '11.0' THEN 'SQL Server 2012 SP3 CU4'
|
||||
WHEN '10.5' THEN 'SQL Server 2008 R2 SP3'
|
||||
WHEN '10.0' THEN 'SQL Server 2008 SP4'
|
||||
END
|
||||
|
||||
|
||||
DECLARE @Temp1 NVARCHAR(100) = 'You have already installed the latest service pack.'
|
||||
DECLARE @Temp12 NVARCHAR(100) = 'Install the latest service pack: '
|
||||
SELECT @SPInfo =
|
||||
CASE @ProductName
|
||||
WHEN 'SQL Server 2016' THEN
|
||||
CASE @ProductLevel
|
||||
WHEN 'RTM' THEN @Temp1 ELSE @Temp12 + 'RTM, <https://support.microsoft.com/en-us/kb/3177534>'
|
||||
END
|
||||
WHEN 'SQL Server 2014' THEN
|
||||
CASE @ProductLevel
|
||||
WHEN 'SP2' THEN @Temp1 ELSE @Temp12 + 'SP2, <https://support.microsoft.com/en-us/kb/3171021>'
|
||||
END
|
||||
WHEN 'SQL Server 2012' THEN
|
||||
CASE @ProductLevel
|
||||
WHEN 'SP3' THEN @Temp1 ELSE @Temp12 + 'SP3, <https://support.microsoft.com/en-us/kb/3072779>'
|
||||
END
|
||||
WHEN 'SQL Server 2008 R2' THEN
|
||||
CASE @ProductLevel
|
||||
WHEN 'SP3' THEN @Temp1 ELSE @Temp12 + 'SP3, <https://support.microsoft.com/en-us/kb/2979597>'
|
||||
END
|
||||
WHEN 'SQL Server 2008' THEN
|
||||
CASE @ProductLevel
|
||||
WHEN 'SP4' THEN @Temp1 ELSE @Temp12 + 'SP4, <https://support.microsoft.com/en-us/kb/2979596>'
|
||||
END
|
||||
END,
|
||||
@CUInfo =
|
||||
CASE @ProductName
|
||||
WHEN 'SQL Server 2016' THEN
|
||||
CASE @ProductVersion
|
||||
WHEN '13.0.2164.0' THEN 'You have already installed the latest cumulative update.'
|
||||
ELSE 'Install the latest Cumulative Update (CU) of RTM: CU2, <https://support.microsoft.com/en-us/kb/3182270>'
|
||||
END
|
||||
WHEN 'SQL Server 2014' THEN
|
||||
CASE @ProductVersion
|
||||
WHEN '12.0.5522.0' THEN 'You have already installed the latest cumulative update.'
|
||||
ELSE 'Install the latest Cumulative Update (CU) of SP2: CU2, <https://support.microsoft.com/en-us/kb/2936603>'
|
||||
END
|
||||
WHEN 'SQL Server 2012' THEN
|
||||
CASE @ProductVersion
|
||||
WHEN '11.0.6544.0' THEN 'You have already installed the latest cumulative update.'
|
||||
ELSE 'Install the latest Cumulative Update (CU) of SP3: CU5, <https://support.microsoft.com/en-us/kb/3180915>'
|
||||
END
|
||||
|
||||
--WHEN 'SQL Server 2008 R2' THEN
|
||||
--WHEN 'SQL Server 2008' THEN
|
||||
END
|
||||
|
||||
IF (@UpdateRef <> '')
|
||||
BEGIN
|
||||
SET @UpdateRefOutput = @UpdateRef + ' (' + 'https://support.microsoft.com/kb/'+SUBSTRING(@UpdateRef,3,10)+ ')'
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL Server 2008')
|
||||
BEGIN
|
||||
|
||||
IF (@ProductLevel = 'RTM') AND (@ProductVersion < '10.00.1835.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU10'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/979064';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP1') AND (@ProductVersion < '10.00.2850.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU16'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2582282';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP2') AND (@ProductVersion < '10.00.4333.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU11'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2715951';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP3') AND (@ProductVersion < '10.00.5861.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU17'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2958696';
|
||||
END
|
||||
|
||||
SELECT @OtherProduct =
|
||||
CASE
|
||||
WHEN @ProductLevel IN ('RTM','SP1') THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2008R2E+@2008R2Dat
|
||||
WHEN @EditionID = -1534726760 THEN @2008R2E+@2008R2Dat+@2008R2Std
|
||||
WHEN @EditionID = -2117995310 THEN @2008R2Dat+@2008R2Dev
|
||||
WHEN @Edition LIKE 'Express%' THEN @2008R2E+@2008R2Dat+@2008R2Std+@2008R2Wg+@2008R2Dev+@2008R2ExpAdv
|
||||
END
|
||||
|
||||
WHEN @ProductLevel = 'SP2' THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2008R2E+@2008R2Dat + @2012E+@2012BI
|
||||
WHEN @EditionID = -1534726760 THEN @2008R2E+@2008R2Dat+@2008R2Std + @2012E+@2012BI+@2012Std
|
||||
WHEN @EditionID = -2117995310 THEN @2008R2Dat+@2008R2Dev + @2012Dev
|
||||
WHEN @Edition LIKE 'Express%' THEN @2008R2E+@2008R2Dat+@2008R2Std+@2008R2Wg+@2008R2Dev+@2008R2ExpAdv
|
||||
+ @2012E+@2012BI+@2012Std+@2012Web+@2012Exp
|
||||
END
|
||||
|
||||
WHEN @ProductLevel IN('SP3','SP4') THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2008R2E+@2008R2Dat + @2012E+@2012BI + @2014E+@2014BI + @2016E+@2016BI
|
||||
WHEN @EditionID = -1534726760 THEN @2008R2E+@2008R2Dat+@2008R2Std + @2012E+@2012BI+@2012Std
|
||||
+ @2014E+@2014BI+@2014Std + @2016E+@2016BI+@2016Std
|
||||
WHEN @EditionID = -2117995310 THEN @2008R2Dat+@2008R2Dev + @2012Dev + @2014Dev + @2016Dev
|
||||
WHEN @Edition LIKE 'Express%' THEN @2008R2E+@2008R2Dat+@2008R2Std+@2008R2Wg+@2008R2Dev+@2008R2ExpAdv
|
||||
+ @2012E+@2012BI+@2012Std+@2012Web+@2012Exp
|
||||
+ @2014E+@2014BI+@2014Std+@2014Web+@2014Exp
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
IF (@ProductName = 'SQL Server 2008 R2')
|
||||
BEGIN
|
||||
|
||||
IF (@ProductLevel = 'RTM') AND (@ProductVersion < '10.50.1815.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU13'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2679366';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP1') AND (@ProductVersion < '10.50.2881.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU14'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2868244';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP2') AND (@ProductVersion < '10.50.4319.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU13'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2967540';
|
||||
END
|
||||
|
||||
SELECT @OtherProduct =
|
||||
CASE
|
||||
WHEN @ProductLevel = 'RTM' THEN ' If you want to upgrade to higher edition, please intall service pack.'
|
||||
WHEN @ProductLevel = 'SP1' THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2012E+@2012BI
|
||||
WHEN @EditionID = -1534726760 THEN @2012E+@2012BI+@2012Std
|
||||
WHEN @EditionID = -2117995310 THEN @2012Dev
|
||||
WHEN @Edition LIKE 'Express%' THEN @2012E+@2012BI+@2012Std+@2012Web+@2012Exp
|
||||
END
|
||||
WHEN @ProductLevel IN('SP2','SP3','SP4') THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2012E+@2012BI + @2014E+@2014BI + @2016E+@2016BI
|
||||
WHEN @EditionID = -1534726760 THEN @2012E+@2012BI+@2012Std + @2014E+@2014BI+@2014Std + @2016E+@2016BI+@2016Std
|
||||
WHEN @EditionID = -2117995310 THEN @2012Dev + @2014Dev + @2016Dev
|
||||
WHEN @Edition LIKE 'Express%' THEN @2012E+@2012BI+@2012Std+@2012Web+@2012Exp
|
||||
+ @2014E+@2014BI+@2014Std+@2014Web+@2014Exp
|
||||
+ @2016E+@2016BI+@2016Std+@2016Web+@2016Exp
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
IF (@ProductName = 'SQL Server 2012')
|
||||
BEGIN
|
||||
|
||||
--2012
|
||||
IF (@ProductLevel = 'RTM') AND (@ProductVersion < '11.0.3000.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU11'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2908007';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP1') AND (@ProductVersion < '11.0.3487.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU16'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/3052476';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP2') AND (@ProductVersion < '11.0.5657.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU14'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/3180914';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP3') AND (@ProductVersion < '11.0.6544.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU5'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/3180915';
|
||||
END
|
||||
SELECT @OtherProduct =
|
||||
CASE
|
||||
WHEN @ProductLevel = 'RTM' THEN ' If you want to upgrade to higher edition, please intall service pack.'
|
||||
WHEN @ProductLevel IN('SP1','SP2','SP3','SP4') THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2014E+@2014BI + @2016E+@2016BI
|
||||
WHEN @EditionID = -1534726760 THEN @2014E+@2014BI+@2014Std + @2016E+@2016BI+@2016Std
|
||||
WHEN @EditionID = -2117995310 THEN @2014Dev + @2016E+@2016BI+@2016Std+@2016Web+@2016Dev
|
||||
WHEN @EditionID = -610778273 THEN @2016E+@2016BI+@2016Std+@2016Web+@2016Dev+@2016Eval
|
||||
WHEN @Edition LIKE 'Express%' THEN @2014E+@2014BI+@2014Std+@2014Web+@2014Exp
|
||||
+ @2016E+@2016BI+@2016Std+@2016Web+@2016Exp+@2016Dev
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL Server 2014')
|
||||
BEGIN
|
||||
|
||||
--2014
|
||||
IF (@ProductLevel = 'RTM') AND (@ProductVersion < '12.0.2569.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU14'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/3158271';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP1') AND (@ProductVersion < '12.0.4474.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU9'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/3186964';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP2') AND (@ProductVersion < '12.0.5522.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU2'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2936603';
|
||||
END
|
||||
|
||||
SELECT @OtherProduct =
|
||||
CASE
|
||||
WHEN @ProductLevel IN ('RTM','SP1','SP2') THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2016E+@2016BI
|
||||
WHEN @EditionID = -1534726760 THEN @2016E+@2016BI+@2016Std
|
||||
WHEN @EditionID = -2117995310 THEN @2016E+@2016BI+@2016Std+@2016Web+@2016Dev
|
||||
WHEN @EditionID = -610778273 THEN @2016E+@2016BI+@2016Std+@2016Web+@2016Dev+@2016Eval
|
||||
WHEN @Edition LIKE 'Express%' THEN @2016E+@2016BI+@2016Std+@2016Web+@2016Exp+@2016Dev
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
------------------------------------------------------------
|
||||
--//Begin GDR or QFE ///////////////////////////////////////
|
||||
------------------------------------------------------------
|
||||
DECLARE @SecurityUpdate NVARCHAR(100)
|
||||
DECLARE @GDR NVARCHAR(2000) = ''
|
||||
DECLARE @QFE NVARCHAR(2000) = ''
|
||||
DECLARE @GDRorQFE TINYINT = 0
|
||||
DECLARE @Build NVARCHAR(20) = SUBSTRING(@ProductVersion,1,9)
|
||||
|
||||
IF (@ProductName = 'SQL Server 2014')
|
||||
BEGIN
|
||||
|
||||
IF (@Build in ('12.0.2000','12.0.4100'))
|
||||
SET @GDRorQFE = 1
|
||||
ELSE IF (@Build in ('12.0.2381','12.0.2548'))
|
||||
SET @GDRorQFE = 2
|
||||
ELSE IF (@Build in ('12.0.2254','12.0.2269','12.0.4213'))
|
||||
SET @GDRorQFE = 3
|
||||
ELSE
|
||||
SET @GDRorQFE = 4
|
||||
|
||||
SET @QFE = @QFE
|
||||
--+ CHAR(13) + '12.0.2381 (SQL Server 2014 RTM QFE) https://support.microsoft.com/en-us/kb/2977316'
|
||||
+ CHAR(13) + '12.0.2548 (SQL Server 2014 RTM QFE) http://support.microsoft.com/en-us/kb/3045323'
|
||||
|
||||
SET @GDR = @GDR
|
||||
+ CHAR(13) + '12.0.2254 (SQL Server 2014 RTM GDR) http://support.microsoft.com/kb/2977315/en-us'
|
||||
+ CHAR(13) + '12.0.2269 (SQL Server 2014 RTM GDR) http://support.microsoft.com/en-us/kb/3045324'
|
||||
+ CHAR(13) + '12.0.4213 (SQL Server 2014 SP1 GDR) https://support.microsoft.com/en-us/kb/3070446'
|
||||
|
||||
END
|
||||
|
||||
|
||||
IF (@ProductName = 'SQL Server 2012')
|
||||
BEGIN
|
||||
--1:RTM SP
|
||||
--2:QFE
|
||||
--3:GDR
|
||||
--4:CU
|
||||
IF (@Build in ('11.0.2100','11.0.3000','11.0.5058','11.0.6020'))
|
||||
SET @GDRorQFE = 1
|
||||
ELSE IF (@Build in ('11.0.2376','11.0.3460','11.0.3513','11.0.5613'))
|
||||
SET @GDRorQFE = 2
|
||||
ELSE IF (@Build in ('11.0.2218','11.0.3153','11.0.3156','11.0.5343'))
|
||||
SET @GDRorQFE = 3
|
||||
ELSE
|
||||
SET @GDRorQFE = 4
|
||||
|
||||
SET @QFE = @QFE
|
||||
+ CHAR(13) + '11.0.2376 (SQL Server 2012 RTM QFE) http://support.microsoft.com/en-us/kb/2716441'
|
||||
--+ CHAR(13) + '11.0.3460 (SQL Server 2012 SP1 QFE) http://support.microsoft.com/kb/2977325/en-us'
|
||||
+ CHAR(13) + '11.0.3513 (SQL Server 2012 SP1 QFE) https://support.microsoft.com/en-us/kb/3045317'
|
||||
+ CHAR(13) + '11.0.5613 (SQL Server 2012 SP2 QFE) https://support.microsoft.com/en-us/kb/3045319'
|
||||
|
||||
SET @GDR = @GDR
|
||||
+ CHAR(13) + '11.0.2218 (SQL Server 2012 RTM GDR) https://support.microsoft.com/en-us/kb/2716442'
|
||||
+ CHAR(13) + '11.0.3153 (SQL Server 2012 SP1 GDR) http://support.microsoft.com/kb/2977326/en-us'
|
||||
+ CHAR(13) + '11.0.3156 (SQL Server 2012 SP1 GDR) https://support.microsoft.com/en-us/kb/3045318'
|
||||
+ CHAR(13) + '11.0.5343 (SQL Server 2012 SP2 GDR) https://support.microsoft.com/en-us/kb/3045321'
|
||||
|
||||
END
|
||||
|
||||
|
||||
IF (@ProductName = 'SQL Server 2008 R2')
|
||||
BEGIN
|
||||
|
||||
IF (@Build in ('10.50.1600','10.50.2500','10.50.4000','10.50.6000'))
|
||||
SET @GDRorQFE = 1
|
||||
ELSE IF (@Build in ('10.50.1790','10.50.2861','10.50.4321','10.50.4339','10.50.6220','10.50.6529'))
|
||||
SET @GDRorQFE = 2
|
||||
ELSE IF (@Build in ('10.50.1617','10.50.2550','10.50.4033','10.50.4042'))
|
||||
SET @GDRorQFE = 3
|
||||
ELSE
|
||||
SET @GDRorQFE = 4
|
||||
|
||||
SET @QFE = @QFE
|
||||
+ CHAR(13) + '10.50.1790 (SQL Server 2008 R2 RTM QFE) http://support.microsoft.com/kb/2494086'
|
||||
+ CHAR(13) + '10.50.2861 (SQL Server 2008 R2 SP1 QFE) http://support.microsoft.com/kb/2716439'
|
||||
+ CHAR(13) + '10.50.4339 (SQL Server 2008 R2 SP2 QFE) http://support.microsoft.com/kb/3045312/en-us'
|
||||
+ CHAR(13) + '10.50.6529 (SQL Server 2008 R2 SP3 QFE) http://support.microsoft.com/kb/3045314/en-us'
|
||||
|
||||
SET @GDR = @GDR
|
||||
+ CHAR(13) + '10.50.1617 (SQL Server 2008 R2 RTM GDR) http://support.microsoft.com/kb/2494088'
|
||||
+ CHAR(13) + '10.50.2550 (SQL Server 2008 R2 SP1 GDR) http://technet.microsoft.com/en-us/security/bulletin/ms12-070'
|
||||
+ CHAR(13) + '10.50.4033 (SQL Server 2008 R2 SP2 GDR) http://support.microsoft.com/kb/2977320/en-us'
|
||||
+ CHAR(13) + '10.50.4042 (SQL Server 2008 R2 SP2 GDR) http://support.microsoft.com/kb/3045313/en-us'
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL Server 2008')
|
||||
BEGIN
|
||||
|
||||
IF (@Build in ('10.00.1600','10.00.2531','10.00.4000','10.00.5500','10.00.6000'))
|
||||
SET @GDRorQFE = 1
|
||||
ELSE IF (@Build in ('10.00.2841','10.00.4311','10.00.4371','10.00.5826','10.00.5869','10.00.5890','10.00.6535'))
|
||||
SET @GDRorQFE = 2
|
||||
ELSE IF (@Build in ('10.00.2573','10.00.4064','10.00.4067','10.00.5512','10.00.5520','10.00.5538','10.00.6241'))
|
||||
SET @GDRorQFE = 3
|
||||
ELSE
|
||||
SET @GDRorQFE = 4
|
||||
|
||||
|
||||
SET @QFE = @QFE
|
||||
+ CHAR(13) + '10.00.2841 (SQL Server 2008 SP1 QFE) https://support.microsoft.com/en-us/kb/2494100'
|
||||
+ CHAR(13) + '10.00.4371 (SQL Server 2008 SP2 QFE) http://support.microsoft.com/en-us/kb/2716433'
|
||||
+ CHAR(13) + '10.00.5890 (SQL Server 2008 SP3 QFE) https://support.microsoft.com/en-us/kb/3045303'
|
||||
+ CHAR(13) + '10.00.6535 (SQL Server 2008 SP4 QFE) http://support.microsoft.com/kb/3045308/en-us'
|
||||
|
||||
SET @GDR = @GDR
|
||||
+ CHAR(13) + '10.00.2573 (SQL Server 2008 SP1 GDR) http://support.microsoft.com/kb/2494096'
|
||||
+ CHAR(13) + '10.00.4064 (SQL Server 2008 SP2 GDR) http://support.microsoft.com/kb/2494089'
|
||||
+ CHAR(13) + '10.00.4067 (SQL Server 2008 SP2 GDR) http://support.microsoft.com/en-us/kb/2716434'
|
||||
+ CHAR(13) + '10.00.5512 (SQL Server 2008 SP3 GDR) http://support.microsoft.com/en-us/kb/2716436'
|
||||
+ CHAR(13) + '10.00.5520 (SQL Server 2008 SP3 GDR) http://support.microsoft.com/kb/2977321/en-us'
|
||||
+ CHAR(13) + '10.00.5538 (SQL Server 2008 SP3 GDR) https://support.microsoft.com/en-us/kb/3045305'
|
||||
+ CHAR(13) + '10.00.6241 (SQL Server 2008 SP4 GDR) https://support.microsoft.com/en-us/kb/3045311'
|
||||
END
|
||||
|
||||
IF @GDRorQFE = 2
|
||||
SET @SecurityUpdate = '+ Security update(QFE branch)'
|
||||
ELSE IF @GDRorQFE = 3
|
||||
SET @SecurityUpdate = '+ Security update(GDR)'
|
||||
ELSE
|
||||
SET @SecurityUpdate = ''
|
||||
|
||||
------------------------------------------------------------
|
||||
--//GDR or QFE end /////////////////////////////////////////
|
||||
------------------------------------------------------------
|
||||
|
||||
--begin output results
|
||||
--//Your current Microsoft SQL Server information:
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT '--//Your current Microsoft SQL Server information:'
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Product Version: ' + @ProductVersion
|
||||
PRINT 'Product Name: ' + @ProductName
|
||||
PRINT 'Product Level: ' + @ProductLevel + ' ' + @SecurityUpdate
|
||||
PRINT 'Product Edition: ' + @Edition
|
||||
|
||||
IF (@ProductName = 'SQL Server 2014')
|
||||
AND ((@ProductLevel = 'RTM' AND SUBSTRING(@UpdateLevel,3,4) >= 10)
|
||||
OR (@ProductLevel = 'SP1' AND SUBSTRING(@UpdateLevel,3,4) >= 3)
|
||||
OR (@ProductLevel > 'SP1'))
|
||||
BEGIN
|
||||
PRINT 'Product Update Level: ' + @UpdateLevel
|
||||
PRINT 'Product Update Reference: ' + @UpdateRefOutput
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
IF (@ProductName = 'SQL Server 2014' AND @ProductLevel = 'RTM' AND SUBSTRING(@UpdateLevel,3,4) < 10)
|
||||
BEGIN
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Note, if you want to know information about CU, you need to intall'
|
||||
+ CHAR(13) + 'SQL Server 2014 RTM Cumulative Update 10. CU10, <https://support.microsoft.com/en-us/kb/3094220>'
|
||||
+ CHAR(13) + REPLICATE(' ',50) + '- see KB3094220 to get the Cumulative Update 10'
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL Server 2014' AND @ProductLevel = 'SP1' AND SUBSTRING(@UpdateLevel,3,4) < 3)
|
||||
BEGIN
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Note, if you want to know information about CU, you need to intall'
|
||||
+ CHAR(13) + 'SQL Server 2014 SP1 Cumulative Update 3. CU3, <https://support.microsoft.com/en-us/kb/3094221>'
|
||||
+ CHAR(13) + REPLICATE(' ',50) + '- see KB3094221 to get the Cumulative Update 3'
|
||||
END
|
||||
|
||||
IF (@ProductName <> 'SQL Server 2014')
|
||||
BEGIN
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Note, if you want to know information about CU, please read this KB below.'
|
||||
+ CHAR(13) + 'KB321185,' + ' <https://support.microsoft.com/en-us/kb/321185>'
|
||||
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
|
||||
PRINT REPLICATE('-',105)
|
||||
|
||||
--//lifecycle Support
|
||||
IF (@ProductName = 'SQL server 2008' OR @ProductName = 'SQL server 2008 R2')
|
||||
BEGIN
|
||||
PRINT @ExtendedSupport
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL server 2012')
|
||||
BEGIN
|
||||
IF @ProductLevel = 'SP2' OR @ProductLevel = 'SP3'
|
||||
PRINT @MainSupport
|
||||
ELSE
|
||||
PRINT @MainSupportNonUpdate
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL server 2014' OR @ProductName = 'SQL server 2016')
|
||||
BEGIN
|
||||
PRINT @MainSupport
|
||||
END
|
||||
|
||||
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Full information:' + CHAR(13) + @@VERSION
|
||||
|
||||
--//Recommended Updates:
|
||||
|
||||
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT '--//Recommended updates: '--Upgrade to ' + @TheLastVersion
|
||||
PRINT '--### RTM -> QFE or GDR'
|
||||
PRINT '--### SP -> QFE or GDR'
|
||||
PRINT '--### QFE -> QFE'
|
||||
PRINT '--### GDR -> GDR or QFE'
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT @SPInfo
|
||||
|
||||
IF @CUInfo IS NOT NULL
|
||||
PRINT @CUInfo
|
||||
PRINT ''
|
||||
|
||||
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT '###### QFE branch updates'
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT SUBSTRING(@QFE,2,2000)
|
||||
|
||||
IF (@GDRorQFE in (1,3))
|
||||
BEGIN
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT '###### GDR branch updates'
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT SUBSTRING(@GDR,2,2000)
|
||||
END
|
||||
|
||||
IF @CumulativeUpdate IS NOT NULL
|
||||
BEGIN
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Note, if you don''t want to upgrade to latest service pack right now, we recommend you install the latest'
|
||||
+ CHAR(13) + 'Cumulative Update ' + @CumulativeUpdate + ' of ' + @ProductName + ' ' + @ProductLevel + '.'
|
||||
+ CHAR(13) + 'Install the latest Cumulative Update (CU) of ' + @ProductLevel + ': ' + @CumulativeUpdate +', <' + @CumulativeUpdateKB + '>'
|
||||
END
|
||||
|
||||
|
||||
--//You can upgrade to any of the following product(s):
|
||||
PRINT CHAR(13)
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT '--//You can upgrade to any of the following product(s):'
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT SUBSTRING(@OtherProduct,2,800)
|
||||
PRINT CHAR(13)
|
||||
PRINT 'For additional information about supported version and edition upgrades refer to:'
|
||||
+ CHAR(13) +'https://technet.microsoft.com/en-us/library/ms143393(v=sql.120).aspx'
|
||||
GO
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
SELECT create_date
|
||||
FROM sys.server_principals
|
||||
WHERE sid = 0x010100000000000512000000
|
||||
@@ -0,0 +1,14 @@
|
||||
create table #SVer(ID int, Name sysname, Internal_Value int, Value nvarchar(512)) insert #SVer exec master.dbo.xp_msver
|
||||
declare @SmoRoot nvarchar(512)
|
||||
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Setup', N'SQLPath', @SmoRoot OUTPUT
|
||||
|
||||
SELECT
|
||||
serverproperty('ComputerNamePhysicalNetBIOS') as HostName,
|
||||
serverproperty(N'Servername') AS [Instance_Name],
|
||||
(select Value from #SVer where Name = N'ProductName') AS [Product],
|
||||
CAST(SERVERPROPERTY(N'Edition') AS sysname) AS [Edition],
|
||||
SERVERPROPERTY(N'ProductVersion') AS [VersionString]
|
||||
|
||||
|
||||
drop table #SVer
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
select @@servername as ServerName, a.Name as JobName, a.enabled, a.start_step_id, b.message, b.run_status, b.run_date as RunDate,
|
||||
substring(replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar), 1, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar), 3, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar), 5, 2) as RunTime,
|
||||
substring(replicate('0', 6 - len(b.run_duration)) + cast(b.run_duration as varchar), 1, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_duration)) + cast(b.run_duration as varchar), 3, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_duration)) + cast(b.run_duration as varchar), 5, 2) as DurationSec
|
||||
from msdb..sysjobs a with (nolock)
|
||||
join msdb..sysjobhistory b with (nolock) on a.job_id = b.job_id
|
||||
where run_status not in (1,4)
|
||||
and cast(cast(b.run_date as varchar) as datetime) > getdate() - 3
|
||||
order by run_date desc, run_time desc
|
||||
|
||||
|
||||
select @@servername as ServerName, a.Name as JobName,
|
||||
a.enabled, a.start_step_id,
|
||||
b.message, b.run_status,
|
||||
b.run_date as RunDate,
|
||||
substring(run_time, 1, 2) + ':' + substring(run_time, 3, 2) + ':' + substring(run_time, 5, 2) as RunTime,
|
||||
b.run_duration as DurationSec
|
||||
from msdb..sysjobs a with (nolock)
|
||||
cross apply (
|
||||
select top 15 b.message, b.run_status,
|
||||
cast(b.run_date as varchar) as run_date, replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar) as run_time,
|
||||
b.run_duration
|
||||
from msdb..sysjobhistory b with (nolock)
|
||||
where b.step_id = 0
|
||||
and a.job_id = b.job_id
|
||||
order by run_date desc, run_time desc
|
||||
) b
|
||||
where run_status <> 1
|
||||
and cast(cast(b.run_date as varchar) as datetime) > getdate() - 2
|
||||
order by name, run_date desc, run_time desc
|
||||
go
|
||||
|
||||
create table #errorlog(logdate datetime, processinfo varchar(255), info varchar(MAX))
|
||||
|
||||
insert into #errorlog
|
||||
exec xp_readerrorlog
|
||||
|
||||
select * from #errorlog
|
||||
where logdate > getdate() - 2
|
||||
and left(info, 29) <> 'Log was backed up. Database: '
|
||||
and left(info, 20) <> 'Starting up database'
|
||||
and left(info, 28) <> 'Log was restored. Database: '
|
||||
and right(info, 34) <> 'does not allow recovery to be run.'
|
||||
and info <> 'Error: 18456, Severity: 14, State: 8.'
|
||||
and info <> 'Error: 18054, Severity: 16, State: 1.'
|
||||
and LEFT(info, 11) <> 'Error: 6000'
|
||||
and LEFT(info, 3) <> 'IDS'
|
||||
and info <> 'Error: 18452, Severity: 14, State: 1.'
|
||||
and info <> 'Error: 17806, Severity: 20, State: 14.'
|
||||
-- and info like '%request%'
|
||||
|
||||
order by logdate
|
||||
drop table #errorlog
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
|
||||
A Simple script to verify whether your SQL Server is running on a Physical Box or a Virtual machine without RDP'ing into your server.
|
||||
|
||||
Note: This Script works only on 2008R2 SP1 and above..
|
||||
|
||||
*/
|
||||
|
||||
SELECT SERVERPROPERTY('computernamephysicalnetbios') AS ServerName
|
||||
,dosi.virtual_machine_type_desc
|
||||
,Server_type = CASE
|
||||
WHEN dosi.virtual_machine_type = 1
|
||||
THEN 'Virtual'
|
||||
ELSE 'Physical'
|
||||
END
|
||||
FROM sys.dm_os_sys_info dosi
|
||||
|
||||
|
||||
|
||||
/* If you have a CMS configured, run the below Script from your CMS against multiple servers*/
|
||||
|
||||
|
||||
SELECT dosi.virtual_machine_type_desc
|
||||
,Server_type = CASE
|
||||
WHEN dosi.virtual_machine_type = 1
|
||||
THEN 'Virtual'
|
||||
ELSE 'Physical'
|
||||
END
|
||||
FROM sys.dm_os_sys_info dosi
|
||||
+1245
File diff suppressed because it is too large
Load Diff
+2826
File diff suppressed because it is too large
Load Diff
+1245
File diff suppressed because it is too large
Load Diff
+1670
File diff suppressed because it is too large
Load Diff
+1170
File diff suppressed because it is too large
Load Diff
+1308
File diff suppressed because it is too large
Load Diff
+1395
File diff suppressed because it is too large
Load Diff
+3542
File diff suppressed because it is too large
Load Diff
+1784
File diff suppressed because it is too large
Load Diff
+1859
File diff suppressed because it is too large
Load Diff
+3682
File diff suppressed because it is too large
Load Diff
+1859
File diff suppressed because it is too large
Load Diff
+3909
File diff suppressed because it is too large
Load Diff
+2009
File diff suppressed because it is too large
Load Diff
+3962
File diff suppressed because it is too large
Load Diff
+1991
File diff suppressed because it is too large
Load Diff
+4076
File diff suppressed because it is too large
Load Diff
+2050
File diff suppressed because it is too large
Load Diff
+4131
File diff suppressed because it is too large
Load Diff
+2063
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,46 @@
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This query will return information about indexes and index usage. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/1545/deeper-insight-into-used-and-unused-indexes-for-sql-server/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
SELECT PVT.SCHEMANAME, PVT.TABLENAME, PVT.INDEXNAME, PVT.INDEX_ID, [1] AS COL1, [2] AS COL2, [3] AS COL3, [4] AS COL4, [5] AS COL5, [6] AS COL6, [7] AS COL7, B.USER_SEEKS, B.USER_SCANS, B.USER_LOOKUPS, B.USER_UPDATES
|
||||
FROM (SELECT SCHEMA_NAME(A.SCHEMA_id) AS SCHEMANAME,
|
||||
A.NAME AS TABLENAME,
|
||||
A.OBJECT_ID,
|
||||
B.NAME AS INDEXNAME,
|
||||
B.INDEX_ID,
|
||||
D.NAME AS COLUMNNAME,
|
||||
C.KEY_ORDINAL
|
||||
FROM SYS.OBJECTS A
|
||||
INNER JOIN SYS.INDEXES B ON A.OBJECT_ID = B.OBJECT_ID
|
||||
LEFT JOIN SYS.INDEX_COLUMNS C ON B.OBJECT_ID = C.OBJECT_ID AND B.INDEX_ID = C.INDEX_ID
|
||||
LEFT JOIN SYS.COLUMNS D ON C.OBJECT_ID = D.OBJECT_ID AND C.COLUMN_ID = D.COLUMN_ID
|
||||
WHERE A.TYPE = 'U') P
|
||||
PIVOT
|
||||
(MIN(COLUMNNAME)
|
||||
FOR KEY_ORDINAL IN ( [1],[2],[3],[4],[5],[6],[7] ) ) AS PVT
|
||||
INNER JOIN SYS.DM_DB_INDEX_USAGE_STATS B ON PVT.OBJECT_ID = B.OBJECT_ID AND PVT.INDEX_ID = B.INDEX_ID AND B.DATABASE_ID = DB_ID()
|
||||
UNION -- below returns indexes not used with usage information
|
||||
SELECT SCHEMANAME, TABLENAME, INDEXNAME, INDEX_ID, [1] AS COL1, [2] AS COL2, [3] AS COL3, [4] AS COL4, [5] AS COL5, [6] AS COL6, [7] AS COL7, 0, 0, 0, 0
|
||||
FROM (SELECT SCHEMA_NAME(A.SCHEMA_id) AS SCHEMANAME,
|
||||
A.NAME AS TABLENAME,
|
||||
A.OBJECT_ID,
|
||||
B.NAME AS INDEXNAME,
|
||||
B.INDEX_ID,
|
||||
D.NAME AS COLUMNNAME,
|
||||
C.KEY_ORDINAL
|
||||
FROM SYS.OBJECTS A
|
||||
INNER JOIN SYS.INDEXES B ON A.OBJECT_ID = B.OBJECT_ID
|
||||
LEFT JOIN SYS.INDEX_COLUMNS C ON B.OBJECT_ID = C.OBJECT_ID AND B.INDEX_ID = C.INDEX_ID
|
||||
LEFT JOIN SYS.COLUMNS D ON C.OBJECT_ID = D.OBJECT_ID AND C.COLUMN_ID = D.COLUMN_ID
|
||||
WHERE A.TYPE = 'U') P
|
||||
PIVOT
|
||||
(MIN(COLUMNNAME)
|
||||
FOR KEY_ORDINAL IN ( [1],[2],[3],[4],[5],[6],[7] ) ) AS PVT
|
||||
WHERE NOT EXISTS (SELECT OBJECT_ID,
|
||||
INDEX_ID
|
||||
FROM SYS.DM_DB_INDEX_USAGE_STATS B
|
||||
WHERE DATABASE_ID = DB_ID(DB_NAME())
|
||||
AND PVT.OBJECT_ID = B.OBJECT_ID
|
||||
AND PVT.INDEX_ID = B.INDEX_ID)
|
||||
ORDER BY SCHEMANAME, TABLENAME, INDEX_ID;
|
||||
@@ -0,0 +1,22 @@
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This query will list all indexes in the database and show index columns and included columns. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/2914/rolling-up-multiple-rows-into-a-single-row-and-column-for-sql-server-data/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
SELECT
|
||||
SCHEMA_NAME(ss.SCHEMA_id) AS SchemaName,
|
||||
ss.name as TableName,
|
||||
ss2.name as IndexName,
|
||||
ss2.index_id,
|
||||
ss2.type_desc,
|
||||
STUFF((SELECT ', ' + name
|
||||
FROM sys.index_columns a INNER JOIN sys.all_columns b ON a.object_id = b.object_id and a.column_id = b.column_id and a.object_id = ss.object_id and a.index_id = ss2.index_id and is_included_column = 0
|
||||
ORDER BY a.key_ordinal
|
||||
FOR XML PATH('')), 1, 2, '') IndexColumns,
|
||||
STUFF((SELECT ', ' + name
|
||||
FROM sys.index_columns a INNER JOIN sys.all_columns b ON a.object_id = b.object_id and a.column_id = b.column_id and a.object_id = ss.object_id and a.index_id = ss2.index_id and is_included_column = 1
|
||||
FOR XML PATH('')), 1, 2, '') IncludedColumns
|
||||
FROM sys.objects SS INNER JOIN sys.indexes ss2 ON ss.OBJECT_ID = ss2.OBJECT_ID
|
||||
WHERE ss.type = 'U'
|
||||
ORDER BY 1, 2, 3
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This query will list all indexes in the database and show index columns and included columns using STRING_AGG (SQL 2017 and later). Run this in the user database.
|
||||
-- More Information:
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
SELECT
|
||||
SCHEMA_NAME(ss.SCHEMA_id) AS SCHEMANAME,
|
||||
ss.name as TableName,
|
||||
ss2.name as IndexName,
|
||||
ss2.index_id,
|
||||
(SELECT STRING_AGG(name,', ')
|
||||
FROM sys.index_columns a INNER JOIN sys.all_columns b ON a.object_id = b.object_id and a.column_id = b.column_id and a.object_id = ss.object_id and a.index_id = ss2.index_id and is_included_column = 0
|
||||
) as IndexColumns,
|
||||
(SELECT STRING_AGG(name,', ')
|
||||
FROM sys.index_columns a INNER JOIN sys.all_columns b ON a.object_id = b.object_id and a.column_id = b.column_id and a.object_id = ss.object_id and a.index_id = ss2.index_id and is_included_column = 1
|
||||
) as IncludedColumns
|
||||
FROM sys.objects SS INNER JOIN sys.indexes ss2 ON ss.OBJECT_ID = ss2.OBJECT_ID
|
||||
WHERE ss.type = 'U'
|
||||
ORDER BY 1, 2, 3
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This script will find all indexes that are disabled. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/1788/disabling-indexes-in-sql-server-2005-and-sql-server-2008/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
DECLARE @is_disabled bit = 0 -- 1=disabled 0=enabled
|
||||
|
||||
SELECT
|
||||
SCHEMA_NAME(ss.SCHEMA_id) AS SchemaName,
|
||||
ss.name AS TableName,
|
||||
ss2.index_id AS IndexID,
|
||||
ss2.name AS IndexName,
|
||||
ss2.type_desc AS IndexType,
|
||||
CASE ss2.is_disabled
|
||||
WHEN 0 THEN 'Enabled'
|
||||
ELSE 'Disabled'
|
||||
END AS IndexStatus,
|
||||
ss2.fill_factor AS [FillFactor]
|
||||
FROM sys.objects SS INNER JOIN sys.indexes ss2 ON ss.OBJECT_ID = ss2.OBJECT_ID
|
||||
WHERE ss.is_ms_shipped = 0
|
||||
AND ss2.is_disabled = @is_disabled
|
||||
GO
|
||||
@@ -0,0 +1,5 @@
|
||||
SELECT a.index_id, name, avg_fragmentation_in_percent, fragment_count,
|
||||
avg_fragment_size_in_pages
|
||||
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks2017'),
|
||||
OBJECT_ID('Sales.SalesOrderDetail'), NULL, NULL, NULL) AS a
|
||||
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
|
||||
@@ -0,0 +1,27 @@
|
||||
SELECT DB_NAME(ips.database_id) AS DatabaseName,
|
||||
SCHEMA_NAME(ob.[schema_id]) SchemaNames,
|
||||
ob.[name] AS ObjectName,
|
||||
ix.[name] AS IndexName,
|
||||
ob.type_desc AS ObjectType,
|
||||
ix.type_desc AS IndexType,
|
||||
-- ips.partition_number AS PartitionNumber,
|
||||
ips.page_count AS [PageCount], -- Only Available in DETAILED Mode
|
||||
ips.record_count AS [RecordCount],
|
||||
ips.avg_fragmentation_in_percent AS AvgFragmentationInPercent
|
||||
-- FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, 'DETAILED') ips
|
||||
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, 'SAMPLED') ips -- QuickResult
|
||||
INNER JOIN sys.indexes ix ON ips.[object_id] = ix.[object_id]
|
||||
AND ips.index_id = ix.index_id
|
||||
INNER JOIN sys.objects ob ON ix.[object_id] = ob.[object_id]
|
||||
WHERE ob.[type] IN('U','V')
|
||||
AND ob.is_ms_shipped = 0
|
||||
AND ix.[type] IN(1,2,3,4)
|
||||
AND ix.is_disabled = 0
|
||||
AND ix.is_hypothetical = 0
|
||||
AND ips.alloc_unit_type_desc = 'IN_ROW_DATA'
|
||||
AND ips.index_level = 0
|
||||
-- AND ips.page_count >= 1000 -- Filter to check only table with over 1000 pages
|
||||
-- AND ips.record_count >= 100 -- Filter to check only table with over 1000 rows
|
||||
-- AND ips.database_id = DB_ID() -- Filter to check only current database
|
||||
-- AND ips.avg_fragmentation_in_percent > 50 -- Filter to check over 50% indexes
|
||||
ORDER BY DatabaseName
|
||||
@@ -0,0 +1,94 @@
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This script will generate create scripts for all existing indexes in a database. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/3441/script-out-all-sql-server-indexes-in-a-database-using-tsql/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
declare @SchemaName varchar(100)declare @TableName varchar(256)
|
||||
declare @IndexName varchar(256)
|
||||
declare @ColumnName varchar(100)
|
||||
declare @is_unique varchar(100)
|
||||
declare @IndexTypeDesc varchar(100)
|
||||
declare @FileGroupName varchar(100)
|
||||
declare @is_disabled varchar(100)
|
||||
declare @IndexOptions varchar(max)
|
||||
declare @IndexColumnId int
|
||||
declare @IsDescendingKey int
|
||||
declare @IsIncludedColumn int
|
||||
declare @TSQLScripCreationIndex varchar(max)
|
||||
declare @TSQLScripDisableIndex varchar(max)
|
||||
|
||||
declare CursorIndex cursor for
|
||||
select schema_name(t.schema_id) [schema_name], t.name, ix.name,
|
||||
case when ix.is_unique = 1 then 'UNIQUE ' else '' END
|
||||
, ix.type_desc,
|
||||
case when ix.is_padded=1 then 'PAD_INDEX = ON, ' else 'PAD_INDEX = OFF, ' end
|
||||
+ case when ix.allow_page_locks=1 then 'ALLOW_PAGE_LOCKS = ON, ' else 'ALLOW_PAGE_LOCKS = OFF, ' end
|
||||
+ case when ix.allow_row_locks=1 then 'ALLOW_ROW_LOCKS = ON, ' else 'ALLOW_ROW_LOCKS = OFF, ' end
|
||||
+ case when INDEXPROPERTY(t.object_id, ix.name, 'IsStatistics') = 1 then 'STATISTICS_NORECOMPUTE = ON, ' else 'STATISTICS_NORECOMPUTE = OFF, ' end
|
||||
+ case when ix.ignore_dup_key=1 then 'IGNORE_DUP_KEY = ON, ' else 'IGNORE_DUP_KEY = OFF, ' end
|
||||
+ 'SORT_IN_TEMPDB = OFF, FILLFACTOR =' + CAST(ix.fill_factor AS VARCHAR(3)) AS IndexOptions
|
||||
, ix.is_disabled , FILEGROUP_NAME(ix.data_space_id) FileGroupName
|
||||
from sys.tables t
|
||||
inner join sys.indexes ix on t.object_id=ix.object_id
|
||||
where ix.type>0 and ix.is_primary_key=0 and ix.is_unique_constraint=0 --and schema_name(tb.schema_id)= @SchemaName and tb.name=@TableName
|
||||
and t.is_ms_shipped=0 and t.name<>'sysdiagrams'
|
||||
order by schema_name(t.schema_id), t.name, ix.name
|
||||
|
||||
open CursorIndex
|
||||
fetch next from CursorIndex into @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @IndexOptions,@is_disabled, @FileGroupName
|
||||
|
||||
while (@@fetch_status=0)
|
||||
begin
|
||||
declare @IndexColumns varchar(max)
|
||||
declare @IncludedColumns varchar(max)
|
||||
|
||||
set @IndexColumns=''
|
||||
set @IncludedColumns=''
|
||||
|
||||
declare CursorIndexColumn cursor for
|
||||
select col.name, ixc.is_descending_key, ixc.is_included_column
|
||||
from sys.tables tb
|
||||
inner join sys.indexes ix on tb.object_id=ix.object_id
|
||||
inner join sys.index_columns ixc on ix.object_id=ixc.object_id and ix.index_id= ixc.index_id
|
||||
inner join sys.columns col on ixc.object_id =col.object_id and ixc.column_id=col.column_id
|
||||
where ix.type>0 and (ix.is_primary_key=0 or ix.is_unique_constraint=0)
|
||||
and schema_name(tb.schema_id)=@SchemaName and tb.name=@TableName and ix.name=@IndexName
|
||||
order by ixc.index_column_id
|
||||
|
||||
open CursorIndexColumn
|
||||
fetch next from CursorIndexColumn into @ColumnName, @IsDescendingKey, @IsIncludedColumn
|
||||
|
||||
while (@@fetch_status=0)
|
||||
begin
|
||||
if @IsIncludedColumn=0
|
||||
set @IndexColumns=@IndexColumns + @ColumnName + case when @IsDescendingKey=1 then ' DESC, ' else ' ASC, ' end
|
||||
else
|
||||
set @IncludedColumns=@IncludedColumns + @ColumnName +', '
|
||||
|
||||
fetch next from CursorIndexColumn into @ColumnName, @IsDescendingKey, @IsIncludedColumn
|
||||
end
|
||||
|
||||
close CursorIndexColumn
|
||||
deallocate CursorIndexColumn
|
||||
|
||||
set @IndexColumns = substring(@IndexColumns, 1, len(@IndexColumns)-1)
|
||||
set @IncludedColumns = case when len(@IncludedColumns) >0 then substring(@IncludedColumns, 1, len(@IncludedColumns)-1) else '' end
|
||||
-- print @IndexColumns
|
||||
-- print @IncludedColumns
|
||||
|
||||
set @TSQLScripCreationIndex =''
|
||||
set @TSQLScripDisableIndex =''
|
||||
set @TSQLScripCreationIndex='CREATE '+ @is_unique +@IndexTypeDesc + ' INDEX ' +QUOTENAME(@IndexName)+' ON ' + QUOTENAME(@SchemaName) +'.'+ QUOTENAME(@TableName)+ '('+@IndexColumns+') '+
|
||||
case when len(@IncludedColumns)>0 then CHAR(13) +'INCLUDE (' + @IncludedColumns+ ')' else '' end + CHAR(13)+'WITH (' + @IndexOptions+ ') ON ' + QUOTENAME(@FileGroupName) + ';'
|
||||
|
||||
if @is_disabled=1
|
||||
set @TSQLScripDisableIndex= CHAR(13) +'ALTER INDEX ' +QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@SchemaName) +'.'+ QUOTENAME(@TableName) + ' DISABLE;' + CHAR(13)
|
||||
|
||||
print @TSQLScripCreationIndex
|
||||
print @TSQLScripDisableIndex
|
||||
|
||||
fetch next from CursorIndex into @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @IndexOptions,@is_disabled, @FileGroupName
|
||||
|
||||
end
|
||||
close CursorIndex
|
||||
deallocate CursorIndex
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Find out how much SQL Server memory each index or heap is currently using. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
;WITH src
|
||||
AS (SELECT
|
||||
[Object] = o.name,
|
||||
[Type] = o.type_desc,
|
||||
[Index] = COALESCE(i.name, ''),
|
||||
[Index_Type] = i.type_desc,
|
||||
p.[object_id],
|
||||
p.index_id,
|
||||
au.allocation_unit_id
|
||||
FROM sys.partitions AS p
|
||||
INNER JOIN sys.allocation_units AS au ON p.hobt_id = au.container_id
|
||||
INNER JOIN sys.objects AS o ON p.[object_id] = o.[object_id]
|
||||
INNER JOIN sys.indexes AS i ON o.[object_id] = i.[object_id] AND p.index_id = i.index_id
|
||||
WHERE au.[type] IN (1, 2, 3)
|
||||
AND o.is_ms_shipped = 0)
|
||||
SELECT
|
||||
src.[Object],
|
||||
src.[Type],
|
||||
src.[Index],
|
||||
src.Index_Type,
|
||||
buffer_pages = COUNT_BIG(b.page_id),
|
||||
buffer_mb = COUNT_BIG(b.page_id) / 128
|
||||
FROM src
|
||||
INNER JOIN sys.dm_os_buffer_descriptors AS b ON src.allocation_unit_id = b.allocation_unit_id
|
||||
WHERE b.database_id = DB_ID()
|
||||
GROUP BY src.[Object],
|
||||
src.[Type],
|
||||
src.[Index],
|
||||
src.Index_Type
|
||||
ORDER BY buffer_pages DESC;
|
||||
@@ -0,0 +1,23 @@
|
||||
-- Find All SQL Server Tables in Database With a Primary Key
|
||||
SELECT
|
||||
c.name as SchemaName,
|
||||
b.name as TableName,
|
||||
a.name as PKname
|
||||
FROM sys.key_constraints a
|
||||
INNER JOIN sys.tables b ON a.parent_object_id = b.OBJECT_ID
|
||||
INNER JOIN sys.schemas c ON a.schema_id = c.schema_id
|
||||
WHERE a.type = 'PK'
|
||||
|
||||
-- Find All SQL Server Tables in Database Without a Primary Key
|
||||
|
||||
SELECT
|
||||
c.name as SchemaName,
|
||||
b.name as TableName
|
||||
FROM sys.tables b
|
||||
INNER JOIN sys.schemas c ON b.schema_id = c.schema_id
|
||||
WHERE b.type = 'U'
|
||||
AND NOT EXISTS (SELECT a.name
|
||||
FROM sys.key_constraints a
|
||||
WHERE a.parent_object_id = b.OBJECT_ID
|
||||
AND a.schema_id = c.schema_id
|
||||
AND a.type = 'PK' )
|
||||
@@ -0,0 +1,5 @@
|
||||
SELECT DB_NAME(database_id) AS database_name,
|
||||
OBJECT_NAME(s.object_id) AS object_name, i.name, s.*
|
||||
FROM sys.dm_db_index_usage_stats s JOIN sys.indexes i
|
||||
ON s.object_id = i.object_id AND s.index_id = i.index_id
|
||||
--AND OBJECT_ID('dbo.SalesOrderDetail') = s.object_id
|
||||
@@ -0,0 +1,50 @@
|
||||
DECLARE @Database NVARCHAR(255)
|
||||
DECLARE @Table NVARCHAR(255)
|
||||
DECLARE @cmd NVARCHAR(1000)
|
||||
|
||||
DECLARE DatabaseCursor CURSOR READ_ONLY FOR
|
||||
SELECT name FROM master.sys.databases
|
||||
WHERE name NOT IN ('master','msdb','tempdb','model','distribution') -- databases to exclude
|
||||
--WHERE name IN ('DB1', 'DB2') -- use this to select specific databases and comment out line above
|
||||
AND state = 0 -- database is online
|
||||
AND is_in_standby = 0 -- database is not read only for log shipping
|
||||
ORDER BY 1
|
||||
|
||||
OPEN DatabaseCursor
|
||||
|
||||
FETCH NEXT FROM DatabaseCursor INTO @Database
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
|
||||
SET @cmd = 'DECLARE TableCursor CURSOR READ_ONLY FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +
|
||||
table_name + '']'' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES WHERE table_type = ''BASE TABLE'''
|
||||
|
||||
-- create table cursor
|
||||
EXEC (@cmd)
|
||||
OPEN TableCursor
|
||||
|
||||
FETCH NEXT FROM TableCursor INTO @Table
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
BEGIN TRY
|
||||
SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD'
|
||||
--PRINT @cmd -- uncomment if you want to see commands
|
||||
EXEC (@cmd)
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
PRINT '---'
|
||||
PRINT @cmd
|
||||
PRINT ERROR_MESSAGE()
|
||||
PRINT '---'
|
||||
END CATCH
|
||||
|
||||
FETCH NEXT FROM TableCursor INTO @Table
|
||||
END
|
||||
|
||||
CLOSE TableCursor
|
||||
DEALLOCATE TableCursor
|
||||
|
||||
FETCH NEXT FROM DatabaseCursor INTO @Database
|
||||
END
|
||||
CLOSE DatabaseCursor
|
||||
DEALLOCATE DatabaseCursor
|
||||
@@ -0,0 +1,50 @@
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This query will find indexes with duplicate columns. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/3604/identify-sql-server-indexes-with-duplicate-columns/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
SELECT t1.tablename, t1.indexname ,t1.columnlist, t2.indexname, t2.columnlist
|
||||
FROM
|
||||
(SELECT
|
||||
DISTINCT object_name(i.object_id) tablename,
|
||||
i.name indexname,
|
||||
(SELECT DISTINCT STUFF( (SELECT ', ' + c.name
|
||||
FROM sys.index_columns ic1
|
||||
INNER JOIN sys.columns c ON ic1.object_id=c.object_id AND ic1.column_id=c.column_id
|
||||
WHERE
|
||||
ic1.index_id = ic.index_id
|
||||
AND ic1.object_id=i.object_id
|
||||
AND ic1.index_id=i.index_id
|
||||
ORDER BY index_column_id FOR XML PATH('')
|
||||
),1,2,'')
|
||||
FROM sys.index_columns ic
|
||||
WHERE object_id=i.object_id AND index_id=i.index_id
|
||||
) as columnlist
|
||||
FROM sys.indexes i
|
||||
INNER JOIN sys.index_columns ic ON i.object_id=ic.object_id AND i.index_id=ic.index_id
|
||||
INNER JOIN sys.objects o ON i.object_id=o.object_id
|
||||
WHERE o.is_ms_shipped=0) t1
|
||||
INNER JOIN
|
||||
(SELECT
|
||||
DISTINCT object_name(i.object_id) tablename,
|
||||
i.name indexname,
|
||||
(SELECT DISTINCT STUFF( (SELECT ', ' + c.name
|
||||
FROM sys.index_columns ic1
|
||||
INNER JOIN sys.columns c ON ic1.object_id=c.object_id AND ic1.column_id=c.column_id
|
||||
WHERE
|
||||
ic1.index_id = ic.index_id
|
||||
AND ic1.object_id=i.object_id
|
||||
AND ic1.index_id=i.index_id
|
||||
ORDER BY index_column_id FOR XML PATH('')
|
||||
),1,2,'')
|
||||
FROM sys.index_columns ic
|
||||
WHERE object_id=i.object_id AND index_id=i.index_id
|
||||
) as columnlist
|
||||
FROM sys.indexes i
|
||||
INNER JOIN sys.index_columns ic ON i.object_id=ic.object_id AND i.index_id=ic.index_id
|
||||
INNER JOIN sys.objects o ON i.object_id=o.object_id
|
||||
WHERE o.is_ms_shipped=0) t2
|
||||
ON t1.tablename=t2.tablename
|
||||
AND substring(t2.columnlist,1,len(t1.columnlist))=t1.columnlist
|
||||
AND (t1.columnlist<>t2.columnlist or (t1.columnlist=t2.columnlist AND t1.indexname<>t2.indexname))
|
||||
Binary file not shown.
@@ -0,0 +1,51 @@
|
||||
select schema_name(o.schema_id) as [schema_name] ,
|
||||
object_name(o.object_id) as [table_name] ,
|
||||
i.name as [index_name] ,
|
||||
i.type_desc as [index_type] ,
|
||||
dmv.page_count ,
|
||||
dmv.fragment_count ,
|
||||
round(dmv.avg_fragment_size_in_pages, 2, 2) [avg_fragment_size_in_pages] ,
|
||||
round(dmv.avg_fragmentation_in_percent, 2, 2) [avg_fragmentation_in_percent] ,
|
||||
case when dmv.avg_fragmentation_in_percent <= 5 then 'RELAX'
|
||||
when dmv.avg_fragmentation_in_percent <= 30 then 'REORGANIZE'
|
||||
when dmv.avg_fragmentation_in_percent > 30 then 'REBUILD'
|
||||
end as [action] ,
|
||||
stats_date(dmv.object_id, i.index_id) as stats_update_date ,
|
||||
case when isnull(ps.function_id, 1) = 1 then 'NO'
|
||||
else 'YES'
|
||||
end as partitioned ,
|
||||
coalesce(fg.name, fgp.name) as [file_group_name] ,
|
||||
p.partition_number as [partition_number] ,
|
||||
p.rows as [partition_rows] ,
|
||||
prv_left.value as [partition_lower_boundary_value] ,
|
||||
prv_right.value as [partition_upper_boundary_value] ,
|
||||
case when pf.boundary_value_on_right = 1 then 'RIGHT'
|
||||
when pf.boundary_value_on_right = 0 then 'LEFT'
|
||||
else 'NONE'
|
||||
end as [partition_range] ,
|
||||
pf.name as [partition_function] ,
|
||||
ds.name as [partition_scheme]
|
||||
from sys.partitions as p with ( readpast )
|
||||
inner join sys.indexes as i with ( readpast ) on i.object_id = p.object_id
|
||||
and i.index_id = p.index_id
|
||||
inner join sys.objects as o with ( readpast ) on o.object_id = i.object_id
|
||||
inner join sys.dm_db_index_physical_stats(db_id(), null, null, null,
|
||||
N'LIMITED') dmv on dmv.OBJECT_ID = i.object_id
|
||||
and dmv.index_id = i.index_id
|
||||
and dmv.partition_number = p.partition_number
|
||||
left join sys.data_spaces as ds with ( readpast ) on ds.data_space_id = i.data_space_id
|
||||
left join sys.partition_schemes as ps with ( readpast ) on ps.data_space_id = ds.data_space_id
|
||||
left join sys.partition_functions as pf with ( readpast ) on pf.function_id = ps.function_id
|
||||
left join sys.destination_data_spaces as dds with ( readpast ) on dds.partition_scheme_id = ps.data_space_id
|
||||
and dds.destination_id = p.partition_number
|
||||
left join sys.filegroups as fg with ( readpast ) on fg.data_space_id = i.data_space_id
|
||||
left join sys.filegroups as fgp with ( readpast ) on fgp.data_space_id = dds.data_space_id
|
||||
left join sys.partition_range_values as prv_left with ( readpast ) on ps.function_id = prv_left.function_id
|
||||
and prv_left.boundary_id = p.partition_number
|
||||
- 1
|
||||
left join sys.partition_range_values as prv_right with ( readpast ) on ps.function_id = prv_right.function_id
|
||||
and prv_right.boundary_id = p.partition_number
|
||||
where objectproperty(p.object_id, 'ISMSShipped') = 0
|
||||
order by [avg_fragmentation_in_percent] DESC,
|
||||
[table_name] ,
|
||||
[index_name]
|
||||
@@ -0,0 +1,3 @@
|
||||
create table #SVer(ID int, Name sysname, Internal_Value int, Value nvarchar(512)) insert #SVer exec master.dbo.xp_msver
declare @SmoRoot nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Setup', N'SQLPath', @SmoRoot OUTPUT
|
||||
SELECT
serverproperty('ComputerNamePhysicalNetBIOS') as HostName,
serverproperty(N'Servername') AS [Instance_Name],
(select Value from #SVer where Name = N'ProductName') AS [Product],
CAST(SERVERPROPERTY(N'Edition') AS sysname) AS [Edition],
SERVERPROPERTY(N'ProductVersion') AS [VersionString]
|
||||
drop table #SVer
|
||||
@@ -0,0 +1,43 @@
|
||||
select rtrim(CONVERT(char(256), SERVERPROPERTY('servername'))) as SQLInstance, a.name as LoginName,
|
||||
isnull(type_desc, '') as type_desc, isntname, isntgroup, isntuser, isnull(is_disabled, 0) as is_disabled
|
||||
-- , createdate, updatedate, dbname, is_policy_checked, is_expiration_checked
|
||||
, a.sysadmin, a.securityadmin
|
||||
-- , a.serveradmin, a.setupadmin, a.processadmin, a.diskadmin, a.dbcreator, a.bulkadmin
|
||||
from master.sys.sql_logins x right outer join master.sys.syslogins a on x.name = a.name
|
||||
-- select * from master.sys.syslogins
|
||||
--where a.name not in ('sa','sql_sa','NT AUTHORITY\SYSTEM','NT SERVICE\MSSQLSERVER','PL\IBMSQLAdminsPL',
|
||||
-- 'PL\SSSAITMSQLAGT','NT SERVICE\SQLSERVERAGENT','PL\YGAPSDD_SQL','ELIFE\sssITMSQLsrv','ELIFE\sssLogShippingSQL',
|
||||
-- 'ELIFE\ElSrv_Clu','PLDEV\Local IBM SQL Admins','PLDEV\Local SDD SQL','sssLogShippingSQL')
|
||||
-- and a.name not like '#%'
|
||||
-- and a.name not like '%\Administrator'
|
||||
-- and a.name not like '%\UserSQL33'
|
||||
-- and a.name not like 'NT SERVICE\MSSQL%'
|
||||
-- and a.name not like 'NT SERVICE\SQLAgent%'
|
||||
-- and a.name not like 'PL\SSSAISQL%'
|
||||
---- and a.name not like 'PL\sssaa%'
|
||||
-- and a.name not like 'PL\%$'
|
||||
-- and a.name not like 'ELIFE\SQL%'
|
||||
-- and a.name not like 'PLDEV\sss%'
|
||||
---- and 1 in (a.sysadmin, a.securityadmin, a.serveradmin, a.setupadmin, a.processadmin, a.diskadmin, a.dbcreator)
|
||||
|
||||
select rtrim(CONVERT(char(256), SERVERPROPERTY('ComputerNamePhysicalNetBIOS'))) as ServerP, a.name as LoginName,
|
||||
isnull(type_desc, '') as type_desc, isntname, isntgroup, isntuser, isnull(is_disabled, 0) as is_disabled
|
||||
-- , createdate, updatedate, dbname, is_policy_checked, is_expiration_checked
|
||||
, a.sysadmin, a.securityadmin
|
||||
-- , a.serveradmin, a.setupadmin, a.processadmin, a.diskadmin, a.dbcreator, a.bulkadmin
|
||||
from master.sys.sql_logins x right outer join master.sys.syslogins a on x.name = a.name
|
||||
-- select * from master.sys.syslogins
|
||||
--where a.name not in ('sa','sql_sa','NT AUTHORITY\SYSTEM','NT SERVICE\MSSQLSERVER','PL\IBMSQLAdminsPL',
|
||||
-- 'PL\SSSAITMSQLAGT','NT SERVICE\SQLSERVERAGENT','PL\YGAPSDD_SQL','ELIFE\sssITMSQLsrv','ELIFE\sssLogShippingSQL',
|
||||
-- 'ELIFE\ElSrv_Clu','PLDEV\Local IBM SQL Admins','PLDEV\Local SDD SQL','sssLogShippingSQL')
|
||||
-- and a.name not like '#%'
|
||||
-- and a.name not like '%\Administrator'
|
||||
-- and a.name not like '%\UserSQL33'
|
||||
-- and a.name not like 'NT SERVICE\MSSQL%'
|
||||
-- and a.name not like 'NT SERVICE\SQLAgent%'
|
||||
-- and a.name not like 'PL\SSSAISQL%'
|
||||
---- and a.name not like 'PL\sssaa%'
|
||||
-- and a.name not like 'PL\%$'
|
||||
-- and a.name not like 'ELIFE\SQL%'
|
||||
-- and a.name not like 'PLDEV\sss%'
|
||||
---- and 1 in (a.sysadmin, a.securityadmin, a.serveradmin, a.setupadmin, a.processadmin, a.diskadmin, a.dbcreator)
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
|
||||
A Simple script to verify whether your SQL Server is running on a Physical Box or a Virtual machine without RDP'ing into your server.
|
||||
|
||||
Note: This Script works only on 2008R2 SP1 and above..
|
||||
|
||||
*/
|
||||
|
||||
SELECT SERVERPROPERTY('computernamephysicalnetbios') AS ServerName
|
||||
,dosi.virtual_machine_type_desc
|
||||
,Server_type = CASE
|
||||
WHEN dosi.virtual_machine_type = 1
|
||||
THEN 'Virtual'
|
||||
ELSE 'Physical'
|
||||
END
|
||||
FROM sys.dm_os_sys_info dosi
|
||||
|
||||
|
||||
|
||||
/* If you have a CMS configured, run the below Script from your CMS against multiple servers*/
|
||||
|
||||
|
||||
SELECT dosi.virtual_machine_type_desc
|
||||
,Server_type = CASE
|
||||
WHEN dosi.virtual_machine_type = 1
|
||||
THEN 'Virtual'
|
||||
ELSE 'Physical'
|
||||
END
|
||||
FROM sys.dm_os_sys_info dosi
|
||||
@@ -0,0 +1,6 @@
|
||||
-- pokazuje tylko sesje ktore wykonuja zapis do bazy danych
|
||||
SELECT * FROM
|
||||
sys.dm_exec_sessions
|
||||
WHERE is_user_process = 1
|
||||
AND writes > 0;
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
select @@servername as ServerName, a.Name as JobName, a.enabled, a.start_step_id, b.message, b.run_status, b.run_date as RunDate,
|
||||
substring(replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar), 1, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar), 3, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar), 5, 2) as RunTime,
|
||||
substring(replicate('0', 6 - len(b.run_duration)) + cast(b.run_duration as varchar), 1, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_duration)) + cast(b.run_duration as varchar), 3, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_duration)) + cast(b.run_duration as varchar), 5, 2) as DurationSec
|
||||
from msdb..sysjobs a with (nolock)
|
||||
join msdb..sysjobhistory b with (nolock) on a.job_id = b.job_id
|
||||
where run_status not in (1,4)
|
||||
and cast(cast(b.run_date as varchar) as datetime) > getdate() - 3
|
||||
order by run_date desc, run_time desc
|
||||
|
||||
|
||||
select @@servername as ServerName, a.Name as JobName,
|
||||
a.enabled, a.start_step_id,
|
||||
b.message, b.run_status,
|
||||
b.run_date as RunDate,
|
||||
substring(run_time, 1, 2) + ':' + substring(run_time, 3, 2) + ':' + substring(run_time, 5, 2) as RunTime,
|
||||
b.run_duration as DurationSec
|
||||
from msdb..sysjobs a with (nolock)
|
||||
cross apply (
|
||||
select top 15 b.message, b.run_status,
|
||||
cast(b.run_date as varchar) as run_date, replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar) as run_time,
|
||||
b.run_duration
|
||||
from msdb..sysjobhistory b with (nolock)
|
||||
where b.step_id = 0
|
||||
and a.job_id = b.job_id
|
||||
order by run_date desc, run_time desc
|
||||
) b
|
||||
where run_status <> 1
|
||||
and cast(cast(b.run_date as varchar) as datetime) > getdate() - 2
|
||||
order by name, run_date desc, run_time desc
|
||||
go
|
||||
|
||||
create table #errorlog(logdate datetime, processinfo varchar(255), info varchar(MAX))
|
||||
|
||||
insert into #errorlog
|
||||
exec xp_readerrorlog
|
||||
|
||||
select * from #errorlog
|
||||
where logdate > getdate() - 2
|
||||
and left(info, 29) <> 'Log was backed up. Database: '
|
||||
and left(info, 20) <> 'Starting up database'
|
||||
and left(info, 28) <> 'Log was restored. Database: '
|
||||
and right(info, 34) <> 'does not allow recovery to be run.'
|
||||
and info <> 'Error: 18456, Severity: 14, State: 8.'
|
||||
and info <> 'Error: 18054, Severity: 16, State: 1.'
|
||||
and LEFT(info, 11) <> 'Error: 6000'
|
||||
and LEFT(info, 3) <> 'IDS'
|
||||
and info <> 'Error: 18452, Severity: 14, State: 1.'
|
||||
and info <> 'Error: 17806, Severity: 20, State: 14.'
|
||||
-- and info like '%request%'
|
||||
|
||||
order by logdate
|
||||
drop table #errorlog
|
||||
@@ -0,0 +1 @@
|
||||
select scheduler_id,cpu_id, status, is_online from sys.dm_os_schedulers where status='VISIBLE ONLINE'
|
||||
@@ -0,0 +1,71 @@
|
||||
create table #SVer(ID int, Name sysname, Internal_Value int, Value nvarchar(512)) insert #SVer exec master.dbo.xp_msver
|
||||
declare @SmoRoot nvarchar(512)
|
||||
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Setup', N'SQLPath', @SmoRoot OUTPUT
|
||||
|
||||
--insert into InstanceList
|
||||
SELECT
|
||||
serverproperty(N'ComputerNamePhysicalNetBIOS') AS [Host_name],
|
||||
serverproperty(N'ServerName') as [ServerName],
|
||||
serverproperty(N'InstanceName') as [InstanceName],
|
||||
GETDATE() as date_invent,
|
||||
(select Value from #SVer where Name = N'ProductName') AS [Product],
|
||||
SERVERPROPERTY(N'ProductVersion') AS [VersionString],
|
||||
(select Value from #SVer where Name = N'Language') AS [Language],
|
||||
(select Value from #SVer where Name = N'Platform') AS [Platform],
|
||||
CAST(SERVERPROPERTY(N'Edition') AS sysname) AS [Edition],
|
||||
(select Internal_Value from #SVer where Name = N'ProcessorCount') AS [Processors],
|
||||
(select Value from #SVer where Name = N'WindowsVersion') AS [OSVersion],
|
||||
(select Internal_Value from #SVer where Name = N'PhysicalMemory') AS [PhysicalMemory],
|
||||
cast(SERVERPROPERTY('IsClustered') AS varchar) AS [IsClustered],
|
||||
@SmoRoot AS [RootDirectory],
|
||||
convert(sysname, serverproperty(N'collation')) AS [Collation]
|
||||
|
||||
drop table #SVer
|
||||
|
||||
SELECT
|
||||
serverproperty(N'ComputerNamePhysicalNetBIOS') AS [Host_name],
|
||||
GETDATE() as date_invent,
|
||||
dtb.name AS [Database_Name],
|
||||
|
||||
case
|
||||
when DATABASEPROPERTY(dtb.name,'IsShutDown') is null then 0x200
|
||||
else 0
|
||||
end |
|
||||
case
|
||||
when 1 = dtb.is_in_standby then 0x40
|
||||
else 0
|
||||
end |
|
||||
case
|
||||
when 1 = dtb.is_cleanly_shutdown then 0x80
|
||||
else 0
|
||||
end |
|
||||
case dtb.state
|
||||
when 1 then 0x2
|
||||
when 2 then 0x8
|
||||
when 3 then 0x4
|
||||
when 4 then 0x10
|
||||
when 5 then 0x100
|
||||
when 6 then 0x20
|
||||
else 1
|
||||
end
|
||||
AS [Database_Status_int],
|
||||
convert(sysname,DatabasePropertyEx(dtb.name,'Status')) as Database_status,
|
||||
create_date,
|
||||
dtb.compatibility_level AS [Database_CompatibilityLevel],
|
||||
convert(sysname,DatabasePropertyEx(dtb.name,'Recovery')) AS [RecoveryModel],
|
||||
convert(sysname,DatabasePropertyEx(dtb.name,'UserAccess')) AS [UserAccess],
|
||||
convert(sysname,DatabasePropertyEx(dtb.name,'Updateability')) AS [ReadOnly]
|
||||
FROM
|
||||
master.sys.databases AS dtb
|
||||
LEFT OUTER JOIN sys.database_mirroring AS dmi ON dmi.database_id = dtb.database_id
|
||||
|
||||
WHERE
|
||||
(CAST(case when dtb.name in ('master','model','msdb','tempdb','IBM') then 1 else dtb.is_distributor end AS bit)=0 and CAST(isnull(dtb.source_database_id, 0) AS bit)=0)
|
||||
ORDER BY
|
||||
[Database_Name] ASC
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
CREATE TABLE #CPUValues(
|
||||
[index] SMALLINT,
|
||||
[description] VARCHAR(128),
|
||||
[server_cores] SMALLINT,
|
||||
[value] VARCHAR(5)
|
||||
)
|
||||
|
||||
CREATE TABLE #MemoryValues(
|
||||
[index] SMALLINT,
|
||||
[description] VARCHAR(128),
|
||||
[server_memory] DECIMAL(10,2),
|
||||
[value] VARCHAR(64)
|
||||
)
|
||||
|
||||
INSERT INTO #CPUValues
|
||||
EXEC xp_msver 'ProcessorCount'
|
||||
|
||||
INSERT INTO #MemoryValues
|
||||
EXEC xp_msver 'PhysicalMemory'
|
||||
|
||||
SELECT
|
||||
SERVERPROPERTY('SERVERNAME') AS 'instance',
|
||||
v.sql_version,
|
||||
(SELECT SUBSTRING(CONVERT(VARCHAR(255),SERVERPROPERTY('EDITION')),0,CHARINDEX('Edition',CONVERT(VARCHAR(255),SERVERPROPERTY('EDITION')))) + 'Edition') AS sql_edition,
|
||||
SERVERPROPERTY('ProductLevel') AS 'service_pack_level',
|
||||
SERVERPROPERTY('ProductVersion') AS 'build_number',
|
||||
(SELECT DISTINCT local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID) AS [port],
|
||||
(SELECT [value] FROM sys.configurations WHERE name like '%min server memory%') AS min_server_memory,
|
||||
(SELECT [value] FROM sys.configurations WHERE name like '%max server memory%') AS max_server_memory,
|
||||
(SELECT ROUND(CONVERT(DECIMAL(10,2),server_memory/1024.0),1) FROM #MemoryValues) AS server_memory,
|
||||
server_cores,
|
||||
(SELECT COUNT(*) AS 'sql_cores' FROM sys.dm_os_schedulers WHERE status = 'VISIBLE ONLINE') AS sql_cores,
|
||||
(SELECT [value] FROM sys.configurations WHERE name like '%degree of parallelism%') AS max_dop,
|
||||
(SELECT [value] FROM sys.configurations WHERE name like '%cost threshold for parallelism%') AS cost_threshold_for_parallelism
|
||||
FROM #CPUValues
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
CASE
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '8%' THEN 'SQL Server 2000'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '9%' THEN 'SQL Server 2005'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '10.0%' THEN 'SQL Server 2008'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '10.5%' THEN 'SQL Server 2008 R2'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '11%' THEN 'SQL Server 2012'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '12%' THEN 'SQL Server 2014'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '13%' THEN 'SQL Server 2016'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '14%' THEN 'SQL Server 2017'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '15%' THEN 'SQL Server 2019'
|
||||
ELSE 'UNKNOWN'
|
||||
END AS sql_version
|
||||
) AS v ON 1 = 1
|
||||
|
||||
DROP TABLE #CPUValues
|
||||
DROP TABLE #MemoryValues
|
||||
@@ -0,0 +1,574 @@
|
||||
-- SQL Server Error Log Scripts
|
||||
-- Last script revision - 2019-07-02
|
||||
--
|
||||
-- Scripts provided by MSSQLTips.com are from various contributors. Use links below to learn more about the scripts.
|
||||
--
|
||||
-- Be careful using any of these scripts. Test all scripts in Test/Dev prior to using in Production environments.
|
||||
-- Please refer to the disclaimer policy: https://www.mssqltips.com/disclaimer/
|
||||
-- Please refer to the copyright policy: https://www.mssqltips.com/copyright/
|
||||
--
|
||||
-- Note, these scripts are meant to be run individually.
|
||||
--
|
||||
-- Have a script to contribute or an update? Send an email to: tips@mssqltips.com
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This shows any errors in the SQL Server error log along with all associated error lines.
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/1307/simple-way-to-find-errors-in-sql-server-error-log/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
USE master
|
||||
GO
|
||||
DROP TABLE IF EXISTS #errorLog; -- this is new syntax in SQL 2016 and later
|
||||
--IF OBJECT_ID('tempdb..#errorLog') IS NOT NULL DROP TABLE #errorLog -- this is old syntax prior to SQL 2016
|
||||
|
||||
CREATE TABLE #errorLog (LogDate DATETIME, ProcessInfo VARCHAR(64), [Text] VARCHAR(MAX));
|
||||
|
||||
INSERT INTO #errorLog
|
||||
EXEC sp_readerrorlog 0 -- specify the log number or use nothing for active error log
|
||||
|
||||
SELECT *
|
||||
FROM #errorLog a
|
||||
WHERE EXISTS (SELECT *
|
||||
FROM #errorLog b
|
||||
WHERE [Text] like 'Error:%'
|
||||
AND a.LogDate = b.LogDate
|
||||
AND a.ProcessInfo = b.ProcessInfo)
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Identify location of where the SQL Server Error Log file is written
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/2506/identify-location-of-the-sql-server-error-log-file/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
USE master
|
||||
GO
|
||||
xp_readerrorlog 0, 1, N'Logging SQL Server messages in file'
|
||||
GO
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Stop logging all successful database backpus in the SQL Server Error Log
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/1307/simple-way-to-find-errors-in-sql-server-error-log/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
-- this will temporarily stop logging all successful backup entries to the SQL Server error log
|
||||
-- but this will revert if SQL Server is restarted, so you need to set this trace flag as a startup parameter
|
||||
-- see https://www.mssqltips.com/sqlservertip/960/setting-sql-server-startup-parameters/
|
||||
--
|
||||
USE master
|
||||
GO
|
||||
DBCC TRACEON (3226,-1)
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Create new SQL Server Error Log. This will archive the current error log and create a new empty log.
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/1155/sql-server-error-log-management/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
EXEC master.sys.sp_cycle_errorlog;
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Logging all logins to SQL Server can eat up a lot of space in the error log. This will change the setting so that
|
||||
-- only failed logins are logged to the SQL Server error log, so you can still audit these.
|
||||
-- More information:
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
USE [master]
|
||||
GO
|
||||
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'AuditLevel', REG_DWORD, 2
|
||||
GO
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Increase the number of SQL Server Error Logs from the default of 7. This will increase from 7 to 30.
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/1155/sql-server-error-log-management/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
USE [master]
|
||||
GO
|
||||
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', REG_DWORD, 30
|
||||
GO
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Search for text in all SQL Server Error Logs
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/5613/sql-server-script-to-search-through-all-error-logs/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
DECLARE @LogType INT = 1
|
||||
DECLARE @filterstr NVARCHAR (4000) = 'checkdb' -- change this value for keyword to search
|
||||
|
||||
BEGIN
|
||||
-- The list of all logs table
|
||||
DECLARE @LogList TABLE (LogNumber INT, StartDate DATETIME, SizeInBytes INT)
|
||||
-- All the log rows results table
|
||||
DECLARE @ALLLogRows TABLE (LogDate DATETIME,
|
||||
ProcessInfo NVARCHAR (4000),
|
||||
Test NVARCHAR (4000))
|
||||
|
||||
-- Store in a table variable
|
||||
INSERT INTO @LogList
|
||||
EXEC xp_enumerrorlogs @LogType
|
||||
|
||||
-- Iterate on all the logs and collect all log rows
|
||||
DECLARE @idx INT = 0
|
||||
WHILE @idx <= (SELECT MAX (LogNumber) FROM @LogList)
|
||||
BEGIN
|
||||
INSERT INTO @ALLLogRows
|
||||
EXEC xp_readerrorlog @idx -- Log number
|
||||
, @LogType -- 1=SQL Server log, 2=SQL Agent log
|
||||
, @filterstr -- filter string
|
||||
, @filterstr
|
||||
|
||||
SET @idx += 1
|
||||
END
|
||||
-- Return the results from the log rows table variable
|
||||
SELECT *
|
||||
FROM @ALLLogRows
|
||||
ORDER BY LogDate DESC
|
||||
END
|
||||
GO
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Read through SQL Server Error Log and current default trace file and extract errors and warning.
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/5140/read-all-errors-and-warnings-in-the-sql-server-error-log-for-all-versions/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
-- Load setup
|
||||
CREATE TABLE #ExclusionList ([StringValue] VARCHAR(8000))
|
||||
CREATE TABLE #ObjectTypeName ([ObjectType] INT, [ObjectName] VARCHAR(100))
|
||||
CREATE TABLE #TraceEvents ([Trace_Event_Id] SMALLINT, [Category_Id] SMALLINT, [Name] VARCHAR(128))
|
||||
INSERT INTO #ExclusionList VALUES ('Microsoft Corp')
|
||||
INSERT INTO #ExclusionList VALUES ('Microsoft SQL Server')
|
||||
INSERT INTO #ExclusionList VALUES ('UTC adjust')
|
||||
INSERT INTO #ExclusionList VALUES ('All rights reserved')
|
||||
INSERT INTO #ExclusionList VALUES ('Server name is')
|
||||
INSERT INTO #ExclusionList VALUES ('Server process ID is')
|
||||
INSERT INTO #ExclusionList VALUES ('System Manufact')
|
||||
INSERT INTO #ExclusionList VALUES ('Authentication mode is')
|
||||
INSERT INTO #ExclusionList VALUES ('Logging SQL Server messages in')
|
||||
INSERT INTO #ExclusionList VALUES ('This is an informational message')
|
||||
INSERT INTO #ExclusionList VALUES ('Registry startup parameters')
|
||||
INSERT INTO #ExclusionList VALUES ('Command Line Startup Parameters')
|
||||
INSERT INTO #ExclusionList VALUES ('Using conventional memory in')
|
||||
INSERT INTO #ExclusionList VALUES ('Default collation')
|
||||
INSERT INTO #ExclusionList VALUES ('Query Store settings initialized with')
|
||||
INSERT INTO #ExclusionList VALUES ('The maximum number of dedicated administrator connections for this instance is')
|
||||
INSERT INTO #ExclusionList VALUES ('Starting up database')
|
||||
INSERT INTO #ExclusionList VALUES ('CLR version')
|
||||
INSERT INTO #ExclusionList VALUES ('Using %.dll'' version')
|
||||
INSERT INTO #ExclusionList VALUES ('Software Usage Metrics is')
|
||||
INSERT INTO #ExclusionList VALUES ('Common Language runtime (CLR) functionality initialized using')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL Trace ID % was started by')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL Trace stopped')
|
||||
INSERT INTO #ExclusionList VALUES ('A self-generated certificate was successfully loaded')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL server listening on')
|
||||
INSERT INTO #ExclusionList VALUES ('Server is listening on')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL Server is ready for client connection')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL Server is starting at priority class')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL Server configured for thread mode processing')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL global counter collection task is created')
|
||||
INSERT INTO #ExclusionList VALUES ('Large Page Extensions enabled')
|
||||
INSERT INTO #ExclusionList VALUES ('Server local connection provider is ready to accept connection on')
|
||||
INSERT INTO #ExclusionList VALUES ('Server named pipe provider is ready to accept connection on')
|
||||
INSERT INTO #ExclusionList VALUES ('Recovery complete')
|
||||
INSERT INTO #ExclusionList VALUES ('Dedicated admin connection support was established for listening')
|
||||
INSERT INTO #ExclusionList VALUES ('A new instance of the full-text filter daemon host process')
|
||||
INSERT INTO #ExclusionList VALUES ('Clearing tempdb database')
|
||||
INSERT INTO #ExclusionList VALUES ('No user action is required')
|
||||
INSERT INTO #ExclusionList VALUES ('due to some database maintenance or reconfigure operations')
|
||||
INSERT INTO #ExclusionList VALUES ('The error log has been reinitialized')
|
||||
INSERT INTO #ExclusionList VALUES ('Service Broker manager has')
|
||||
INSERT INTO #ExclusionList VALUES ('FlushCache: cleaned up % bufs with % writes in % ms')
|
||||
INSERT INTO #ExclusionList VALUES ('average throughput: % MB/sec, I/O saturation: %, context switches')
|
||||
INSERT INTO #ExclusionList VALUES ('last target outstanding: %, avgWriteLatency')
|
||||
INSERT INTO #ExclusionList VALUES ('cachestore flush % due to ''DBCC FREEPROCCACHE'' or ''DBCC FREESYSTEMCACHE''')
|
||||
INSERT INTO #ExclusionList VALUES ('Using locked pages for buffer pool')
|
||||
INSERT INTO #ExclusionList VALUES ('Resource governor reconfiguration succeeded')
|
||||
INSERT INTO #ExclusionList VALUES ('FILESTREAM: % file system access share name =')
|
||||
INSERT INTO #ExclusionList VALUES ('The % protocol transport is now listening for connections')
|
||||
INSERT INTO #ExclusionList VALUES ('The % protocol transport is disabled or not configured')
|
||||
INSERT INTO #ExclusionList VALUES ('The % endpoint is in disabled or stopped state')
|
||||
INSERT INTO #ExclusionList VALUES ('Database mirroring has been enabled on this instance of SQL Server')
|
||||
INSERT INTO #ExclusionList VALUES ('Database %: IO is frozen for snapsho')
|
||||
INSERT INTO #ExclusionList VALUES ('Database %: IO is thawe')
|
||||
INSERT INTO #ExclusionList VALUES ('Setting database option COMPATIBILITY_LEVEL to')
|
||||
INSERT INTO #ExclusionList VALUES ('The activated proc % running on queue % output the following')
|
||||
INSERT INTO #ExclusionList VALUES ('Database Audit Backup/Restore Event')
|
||||
INSERT INTO #ExclusionList VALUES ('User-Defined Table Created')
|
||||
INSERT INTO #ExclusionList VALUES ('Index Created')
|
||||
INSERT INTO #ExclusionList VALUES ('Server Audit Server Alter Trace Event')
|
||||
INSERT INTO #ExclusionList VALUES ('Creating member security items for % started at')
|
||||
-- Exclude log shipping database events
|
||||
IF @@VERSION LIKE 'Microsoft SQL Server 2000%'
|
||||
BEGIN
|
||||
INSERT INTO #ExclusionList SELECT 'Setting database option SINGLE_USER to ON for database '+[secondary_database_name] FROM [msdb].[dbo].[log_shipping_secondaries]
|
||||
INSERT INTO #ExclusionList SELECT 'Setting database option MULTI_USER to ON for database '+[secondary_database_name] FROM [msdb].[dbo].[log_shipping_secondaries]
|
||||
INSERT INTO #ExclusionList SELECT 'The database '''+[secondary_database_name]+''' is marked RESTORING' FROM [msdb].[dbo].[log_shipping_secondaries]
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
INSERT INTO #ExclusionList SELECT 'Setting database option SINGLE_USER to ON for database '+[secondary_database] FROM [msdb].[dbo].[log_shipping_secondary_databases]
|
||||
INSERT INTO #ExclusionList SELECT 'Setting database option MULTI_USER to ON for database '+[secondary_database] FROM [msdb].[dbo].[log_shipping_secondary_databases]
|
||||
INSERT INTO #ExclusionList SELECT 'The database '''+[secondary_database]+''' is marked RESTORING' FROM [msdb].[dbo].[log_shipping_secondary_databases]
|
||||
END
|
||||
-- Setup configuration tables
|
||||
INSERT INTO #ObjectTypeName VALUES (1,'Index');
|
||||
INSERT INTO #ObjectTypeName VALUES (2,'Database');
|
||||
INSERT INTO #ObjectTypeName VALUES (3,'User Object');
|
||||
INSERT INTO #ObjectTypeName VALUES (4,'Check Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (5,'Default Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (6,'Foreign Key Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (7,'Primary Key Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (8,'Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (9,'User-Defined Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (10,'Rule');
|
||||
INSERT INTO #ObjectTypeName VALUES (11,'Replication Filter Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (12,'System Table');
|
||||
INSERT INTO #ObjectTypeName VALUES (13,'Trigger');
|
||||
INSERT INTO #ObjectTypeName VALUES (14,'Inline Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (15,'Table Valued UDF');
|
||||
INSERT INTO #ObjectTypeName VALUES (16,'Unique Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (17,'User Table');
|
||||
INSERT INTO #ObjectTypeName VALUES (18,'View');
|
||||
INSERT INTO #ObjectTypeName VALUES (19,'Extended Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (20,'Ad hoc Query');
|
||||
INSERT INTO #ObjectTypeName VALUES (21,'Prepared Query');
|
||||
INSERT INTO #ObjectTypeName VALUES (8259,'Check Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (8260,'Default Constraint/Standalone');
|
||||
INSERT INTO #ObjectTypeName VALUES (8262,'Foreign-Key Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (8272,'Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (8274,'Rule');
|
||||
INSERT INTO #ObjectTypeName VALUES (8275,'System Table');
|
||||
INSERT INTO #ObjectTypeName VALUES (8276,'Trigger on Server');
|
||||
INSERT INTO #ObjectTypeName VALUES (8277,'User-Defined Table');
|
||||
INSERT INTO #ObjectTypeName VALUES (8278,'View');
|
||||
INSERT INTO #ObjectTypeName VALUES (8280,'Extended Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (16724,'CLR Trigger');
|
||||
INSERT INTO #ObjectTypeName VALUES (16964,'Database');
|
||||
INSERT INTO #ObjectTypeName VALUES (16975,'Object');
|
||||
INSERT INTO #ObjectTypeName VALUES (17222,'FullText Catalog');
|
||||
INSERT INTO #ObjectTypeName VALUES (17232,'CLR Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (17235,'Schema');
|
||||
INSERT INTO #ObjectTypeName VALUES (17475,'Credential');
|
||||
INSERT INTO #ObjectTypeName VALUES (17491,'DDL Event');
|
||||
INSERT INTO #ObjectTypeName VALUES (17741,'Management Event');
|
||||
INSERT INTO #ObjectTypeName VALUES (17747,'Security Event');
|
||||
INSERT INTO #ObjectTypeName VALUES (17749,'User Event');
|
||||
INSERT INTO #ObjectTypeName VALUES (17985,'CLR Aggregate Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (17993,'Inline Table-Valued SQL Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (18000,'Partition Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (18002,'Replication Filter Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (18004,'Table-Valued SQL Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (18259,'Server Role');
|
||||
INSERT INTO #ObjectTypeName VALUES (18263,'Microsoft Windows Group');
|
||||
INSERT INTO #ObjectTypeName VALUES (19265,'Asymmetric Key');
|
||||
INSERT INTO #ObjectTypeName VALUES (19277,'Master Key');
|
||||
INSERT INTO #ObjectTypeName VALUES (19280,'Primary Key');
|
||||
INSERT INTO #ObjectTypeName VALUES (19283,'ObfusKey');
|
||||
INSERT INTO #ObjectTypeName VALUES (19521,'Asymmetric Key Login');
|
||||
INSERT INTO #ObjectTypeName VALUES (19523,'Certificate Login');
|
||||
INSERT INTO #ObjectTypeName VALUES (19538,'Role');
|
||||
INSERT INTO #ObjectTypeName VALUES (19539,'SQL Login');
|
||||
INSERT INTO #ObjectTypeName VALUES (19543,'Windows Login');
|
||||
INSERT INTO #ObjectTypeName VALUES (20034,'Remote Service Binding');
|
||||
INSERT INTO #ObjectTypeName VALUES (20036,'Event Notification on Database');
|
||||
INSERT INTO #ObjectTypeName VALUES (20037,'Event Notification');
|
||||
INSERT INTO #ObjectTypeName VALUES (20038,'Scalar SQL Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (20047,'Event Notification on Object');
|
||||
INSERT INTO #ObjectTypeName VALUES (20051,'Synonym');
|
||||
INSERT INTO #ObjectTypeName VALUES (20549,'End Point');
|
||||
INSERT INTO #ObjectTypeName VALUES (20801,'Adhoc Queries which may be cached');
|
||||
INSERT INTO #ObjectTypeName VALUES (20816,'Prepared Queries which may be cached');
|
||||
INSERT INTO #ObjectTypeName VALUES (20819,'Service Broker Service Queue');
|
||||
INSERT INTO #ObjectTypeName VALUES (20821,'Unique Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (21057,'Application Role');
|
||||
INSERT INTO #ObjectTypeName VALUES (21059,'Certificate');
|
||||
INSERT INTO #ObjectTypeName VALUES (21075,'Server');
|
||||
INSERT INTO #ObjectTypeName VALUES (21076,'Transact-SQL Trigger');
|
||||
INSERT INTO #ObjectTypeName VALUES (21313,'Assembly');
|
||||
INSERT INTO #ObjectTypeName VALUES (21318,'CLR Scalar Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (21321,'Inline scalar SQL Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (21328,'Partition Scheme');
|
||||
INSERT INTO #ObjectTypeName VALUES (21333,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (21571,'Service Broker Service Contract');
|
||||
INSERT INTO #ObjectTypeName VALUES (21572,'Trigger on Database');
|
||||
INSERT INTO #ObjectTypeName VALUES (21574,'CLR Table-valued Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (21577,'Internal Table (XML Node/Queue)');
|
||||
INSERT INTO #ObjectTypeName VALUES (21581,'Service Broker Message Type');
|
||||
INSERT INTO #ObjectTypeName VALUES (21586,'Service Broker Route');
|
||||
INSERT INTO #ObjectTypeName VALUES (21587,'Statistics');
|
||||
INSERT INTO #ObjectTypeName VALUES (21825,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (21827,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (21831,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (21843,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (21847,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (22099,'Service Broker Service');
|
||||
INSERT INTO #ObjectTypeName VALUES (22601,'Index');
|
||||
INSERT INTO #ObjectTypeName VALUES (22604,'Certificate Login');
|
||||
INSERT INTO #ObjectTypeName VALUES (22611,'XMLSchema');
|
||||
INSERT INTO #ObjectTypeName VALUES (22868,'Type');
|
||||
INSERT INTO #TraceEvents VALUES (10,11,'RPC:Completed');
|
||||
INSERT INTO #TraceEvents VALUES (11,11,'RPC:Starting');
|
||||
INSERT INTO #TraceEvents VALUES (12,13,'SQL:BatchCompleted');
|
||||
INSERT INTO #TraceEvents VALUES (13,13,'SQL:BatchStarting');
|
||||
INSERT INTO #TraceEvents VALUES (14,8,'Audit Login');
|
||||
INSERT INTO #TraceEvents VALUES (15,8,'Audit Logout');
|
||||
INSERT INTO #TraceEvents VALUES (16,3,'Attention');
|
||||
INSERT INTO #TraceEvents VALUES (17,10,'ExistingConnection');
|
||||
INSERT INTO #TraceEvents VALUES (18,8,'Audit Server Starts And Stops');
|
||||
INSERT INTO #TraceEvents VALUES (19,12,'DTCTransaction');
|
||||
INSERT INTO #TraceEvents VALUES (20,8,'Audit Login Failed');
|
||||
INSERT INTO #TraceEvents VALUES (21,3,'EventLog');
|
||||
INSERT INTO #TraceEvents VALUES (22,3,'ErrorLog');
|
||||
INSERT INTO #TraceEvents VALUES (23,4,'Lock:Released');
|
||||
INSERT INTO #TraceEvents VALUES (24,4,'Lock:Acquired');
|
||||
INSERT INTO #TraceEvents VALUES (25,4,'Lock:Deadlock');
|
||||
INSERT INTO #TraceEvents VALUES (26,4,'Lock:Cancel');
|
||||
INSERT INTO #TraceEvents VALUES (27,4,'Lock:Timeout');
|
||||
INSERT INTO #TraceEvents VALUES (28,6,'Degree of Parallelism');
|
||||
INSERT INTO #TraceEvents VALUES (33,3,'Exception');
|
||||
INSERT INTO #TraceEvents VALUES (34,11,'SP:CacheMiss');
|
||||
INSERT INTO #TraceEvents VALUES (35,11,'SP:CacheInsert');
|
||||
INSERT INTO #TraceEvents VALUES (36,11,'SP:CacheRemove');
|
||||
INSERT INTO #TraceEvents VALUES (37,11,'SP:Recompile');
|
||||
INSERT INTO #TraceEvents VALUES (38,11,'SP:CacheHit');
|
||||
INSERT INTO #TraceEvents VALUES (40,13,'SQL:StmtStarting');
|
||||
INSERT INTO #TraceEvents VALUES (41,13,'SQL:StmtCompleted');
|
||||
INSERT INTO #TraceEvents VALUES (42,11,'SP:Starting');
|
||||
INSERT INTO #TraceEvents VALUES (43,11,'SP:Completed');
|
||||
INSERT INTO #TraceEvents VALUES (44,11,'SP:StmtStarting');
|
||||
INSERT INTO #TraceEvents VALUES (45,11,'SP:StmtCompleted');
|
||||
INSERT INTO #TraceEvents VALUES (46,5,'Object:Created');
|
||||
INSERT INTO #TraceEvents VALUES (47,5,'Object:Deleted');
|
||||
INSERT INTO #TraceEvents VALUES (50,12,'SQLTransaction');
|
||||
INSERT INTO #TraceEvents VALUES (51,7,'Scan:Started');
|
||||
INSERT INTO #TraceEvents VALUES (52,7,'Scan:Stopped');
|
||||
INSERT INTO #TraceEvents VALUES (53,1,'CursorOpen');
|
||||
INSERT INTO #TraceEvents VALUES (54,12,'TransactionLog');
|
||||
INSERT INTO #TraceEvents VALUES (55,3,'Hash Warning');
|
||||
INSERT INTO #TraceEvents VALUES (58,6,'Auto Stats');
|
||||
INSERT INTO #TraceEvents VALUES (59,4,'Lock:Deadlock Chain');
|
||||
INSERT INTO #TraceEvents VALUES (60,4,'Lock:Escalation');
|
||||
INSERT INTO #TraceEvents VALUES (61,15,'OLEDB Errors');
|
||||
INSERT INTO #TraceEvents VALUES (67,3,'Execution Warnings');
|
||||
INSERT INTO #TraceEvents VALUES (68,6,'Showplan Text (Unencoded)');
|
||||
INSERT INTO #TraceEvents VALUES (69,3,'Sort Warnings');
|
||||
INSERT INTO #TraceEvents VALUES (70,1,'CursorPrepare');
|
||||
INSERT INTO #TraceEvents VALUES (71,13,'Prepare SQL');
|
||||
INSERT INTO #TraceEvents VALUES (72,13,'Exec Prepared SQL');
|
||||
INSERT INTO #TraceEvents VALUES (73,13,'Unprepare SQL');
|
||||
INSERT INTO #TraceEvents VALUES (74,1,'CursorExecute');
|
||||
INSERT INTO #TraceEvents VALUES (75,1,'CursorRecompile');
|
||||
INSERT INTO #TraceEvents VALUES (76,1,'CursorImplicitConversion');
|
||||
INSERT INTO #TraceEvents VALUES (77,1,'CursorUnprepare');
|
||||
INSERT INTO #TraceEvents VALUES (78,1,'CursorClose');
|
||||
INSERT INTO #TraceEvents VALUES (79,3,'Missing Column Statistics');
|
||||
INSERT INTO #TraceEvents VALUES (80,3,'Missing Join Predicate');
|
||||
INSERT INTO #TraceEvents VALUES (81,9,'Server Memory Change');
|
||||
INSERT INTO #TraceEvents VALUES (82,14,'UserConfigurable:0');
|
||||
INSERT INTO #TraceEvents VALUES (83,14,'UserConfigurable:1');
|
||||
INSERT INTO #TraceEvents VALUES (84,14,'UserConfigurable:2');
|
||||
INSERT INTO #TraceEvents VALUES (85,14,'UserConfigurable:3');
|
||||
INSERT INTO #TraceEvents VALUES (86,14,'UserConfigurable:4');
|
||||
INSERT INTO #TraceEvents VALUES (87,14,'UserConfigurable:5');
|
||||
INSERT INTO #TraceEvents VALUES (88,14,'UserConfigurable:6');
|
||||
INSERT INTO #TraceEvents VALUES (89,14,'UserConfigurable:7');
|
||||
INSERT INTO #TraceEvents VALUES (90,14,'UserConfigurable:8');
|
||||
INSERT INTO #TraceEvents VALUES (91,14,'UserConfigurable:9');
|
||||
INSERT INTO #TraceEvents VALUES (92,2,'Data File Auto Grow');
|
||||
INSERT INTO #TraceEvents VALUES (93,2,'Log File Auto Grow');
|
||||
INSERT INTO #TraceEvents VALUES (94,2,'Data File Auto Shrink');
|
||||
INSERT INTO #TraceEvents VALUES (95,2,'Log File Auto Shrink');
|
||||
INSERT INTO #TraceEvents VALUES (96,6,'Showplan Text');
|
||||
INSERT INTO #TraceEvents VALUES (97,6,'Showplan All');
|
||||
INSERT INTO #TraceEvents VALUES (98,6,'Showplan Statistics Profile');
|
||||
INSERT INTO #TraceEvents VALUES (100,11,'RPC Output Parameter');
|
||||
INSERT INTO #TraceEvents VALUES (102,8,'Audit Database Scope GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (103,8,'Audit Schema Object GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (104,8,'Audit Addlogin Event');
|
||||
INSERT INTO #TraceEvents VALUES (105,8,'Audit Login GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (106,8,'Audit Login Change Property Event');
|
||||
INSERT INTO #TraceEvents VALUES (107,8,'Audit Login Change Password Event');
|
||||
INSERT INTO #TraceEvents VALUES (108,8,'Audit Add Login to Server Role Event');
|
||||
INSERT INTO #TraceEvents VALUES (109,8,'Audit Add DB User Event');
|
||||
INSERT INTO #TraceEvents VALUES (110,8,'Audit Add Member to DB Role Event');
|
||||
INSERT INTO #TraceEvents VALUES (111,8,'Audit Add Role Event');
|
||||
INSERT INTO #TraceEvents VALUES (112,8,'Audit App Role Change Password Event');
|
||||
INSERT INTO #TraceEvents VALUES (113,8,'Audit Statement Permission Event');
|
||||
INSERT INTO #TraceEvents VALUES (114,8,'Audit Schema Object Access Event');
|
||||
INSERT INTO #TraceEvents VALUES (115,8,'Audit Backup/Restore Event');
|
||||
INSERT INTO #TraceEvents VALUES (116,8,'Audit DBCC Event');
|
||||
INSERT INTO #TraceEvents VALUES (117,8,'Audit Change Audit Event');
|
||||
INSERT INTO #TraceEvents VALUES (118,8,'Audit Object Derived Permission Event');
|
||||
INSERT INTO #TraceEvents VALUES (119,15,'OLEDB Call Event');
|
||||
INSERT INTO #TraceEvents VALUES (120,15,'OLEDB QueryInterface Event');
|
||||
INSERT INTO #TraceEvents VALUES (121,15,'OLEDB DataRead Event');
|
||||
INSERT INTO #TraceEvents VALUES (122,6,'Showplan XML');
|
||||
INSERT INTO #TraceEvents VALUES (123,6,'SQL:FullTextQuery');
|
||||
INSERT INTO #TraceEvents VALUES (124,16,'Broker:Conversation');
|
||||
INSERT INTO #TraceEvents VALUES (125,18,'Deprecation Announcement');
|
||||
INSERT INTO #TraceEvents VALUES (126,18,'Deprecation Final Support');
|
||||
INSERT INTO #TraceEvents VALUES (127,3,'Exchange Spill Event');
|
||||
INSERT INTO #TraceEvents VALUES (128,8,'Audit Database Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (129,8,'Audit Database Object Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (130,8,'Audit Database Principal Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (131,8,'Audit Schema Object Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (132,8,'Audit Server Principal Impersonation Event');
|
||||
INSERT INTO #TraceEvents VALUES (133,8,'Audit Database Principal Impersonation Event');
|
||||
INSERT INTO #TraceEvents VALUES (134,8,'Audit Server Object Take Ownership Event');
|
||||
INSERT INTO #TraceEvents VALUES (135,8,'Audit Database Object Take Ownership Event');
|
||||
INSERT INTO #TraceEvents VALUES (136,16,'Broker:Conversation Group');
|
||||
INSERT INTO #TraceEvents VALUES (137,3,'Blocked process report');
|
||||
INSERT INTO #TraceEvents VALUES (138,16,'Broker:Connection');
|
||||
INSERT INTO #TraceEvents VALUES (139,16,'Broker:Forwarded Message Sent');
|
||||
INSERT INTO #TraceEvents VALUES (140,16,'Broker:Forwarded Message Dropped');
|
||||
INSERT INTO #TraceEvents VALUES (141,16,'Broker:Message Classify');
|
||||
INSERT INTO #TraceEvents VALUES (142,16,'Broker:Transmission');
|
||||
INSERT INTO #TraceEvents VALUES (143,16,'Broker:Queue Disabled');
|
||||
INSERT INTO #TraceEvents VALUES (144,16,'Broker:Mirrored Route State Changed');
|
||||
INSERT INTO #TraceEvents VALUES (146,6,'Showplan XML Statistics Profile');
|
||||
INSERT INTO #TraceEvents VALUES (148,4,'Deadlock graph');
|
||||
INSERT INTO #TraceEvents VALUES (149,16,'Broker:Remote Message Acknowledgement');
|
||||
INSERT INTO #TraceEvents VALUES (150,9,'Trace File Close');
|
||||
INSERT INTO #TraceEvents VALUES (151,2,'Database Mirroring Connection');
|
||||
INSERT INTO #TraceEvents VALUES (152,8,'Audit Change Database Owner');
|
||||
INSERT INTO #TraceEvents VALUES (153,8,'Audit Schema Object Take Ownership Event');
|
||||
INSERT INTO #TraceEvents VALUES (154,8,'Audit Database Mirroring Login');
|
||||
INSERT INTO #TraceEvents VALUES (155,17,'FT:Crawl Started');
|
||||
INSERT INTO #TraceEvents VALUES (156,17,'FT:Crawl Stopped');
|
||||
INSERT INTO #TraceEvents VALUES (157,17,'FT:Crawl Aborted');
|
||||
INSERT INTO #TraceEvents VALUES (158,8,'Audit Broker Conversation');
|
||||
INSERT INTO #TraceEvents VALUES (159,8,'Audit Broker Login');
|
||||
INSERT INTO #TraceEvents VALUES (160,16,'Broker:Message Undeliverable');
|
||||
INSERT INTO #TraceEvents VALUES (161,16,'Broker:Corrupted Message');
|
||||
INSERT INTO #TraceEvents VALUES (162,3,'User Error Message');
|
||||
INSERT INTO #TraceEvents VALUES (163,16,'Broker:Activation');
|
||||
INSERT INTO #TraceEvents VALUES (164,5,'Object:Altered');
|
||||
INSERT INTO #TraceEvents VALUES (165,6,'Performance statistics');
|
||||
INSERT INTO #TraceEvents VALUES (166,13,'SQL:StmtRecompile');
|
||||
INSERT INTO #TraceEvents VALUES (167,2,'Database Mirroring State Change');
|
||||
INSERT INTO #TraceEvents VALUES (168,6,'Showplan XML For Query Compile');
|
||||
INSERT INTO #TraceEvents VALUES (169,6,'Showplan All For Query Compile');
|
||||
INSERT INTO #TraceEvents VALUES (170,8,'Audit Server Scope GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (171,8,'Audit Server Object GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (172,8,'Audit Database Object GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (173,8,'Audit Server Operation Event');
|
||||
INSERT INTO #TraceEvents VALUES (175,8,'Audit Server Alter Trace Event');
|
||||
INSERT INTO #TraceEvents VALUES (176,8,'Audit Server Object Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (177,8,'Audit Server Principal Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (178,8,'Audit Database Operation Event');
|
||||
INSERT INTO #TraceEvents VALUES (180,8,'Audit Database Object Access Event');
|
||||
INSERT INTO #TraceEvents VALUES (181,12,'TM: Begin Tran starting');
|
||||
INSERT INTO #TraceEvents VALUES (182,12,'TM: Begin Tran completed');
|
||||
INSERT INTO #TraceEvents VALUES (183,12,'TM: Promote Tran starting');
|
||||
INSERT INTO #TraceEvents VALUES (184,12,'TM: Promote Tran completed');
|
||||
INSERT INTO #TraceEvents VALUES (185,12,'TM: Commit Tran starting');
|
||||
INSERT INTO #TraceEvents VALUES (186,12,'TM: Commit Tran completed');
|
||||
INSERT INTO #TraceEvents VALUES (187,12,'TM: Rollback Tran starting');
|
||||
INSERT INTO #TraceEvents VALUES (188,12,'TM: Rollback Tran completed');
|
||||
INSERT INTO #TraceEvents VALUES (189,4,'Lock:Timeout (timeout > 0)');
|
||||
INSERT INTO #TraceEvents VALUES (190,19,'Progress Report: Online Index Operation');
|
||||
INSERT INTO #TraceEvents VALUES (191,12,'TM: Save Tran starting');
|
||||
INSERT INTO #TraceEvents VALUES (192,12,'TM: Save Tran completed');
|
||||
INSERT INTO #TraceEvents VALUES (193,3,'Background Job Error');
|
||||
INSERT INTO #TraceEvents VALUES (194,15,'OLEDB Provider Information');
|
||||
INSERT INTO #TraceEvents VALUES (195,9,'Mount Tape');
|
||||
INSERT INTO #TraceEvents VALUES (196,20,'Assembly Load');
|
||||
INSERT INTO #TraceEvents VALUES (198,13,'XQuery Static Type');
|
||||
INSERT INTO #TraceEvents VALUES (199,21,'QN: Subscription');
|
||||
INSERT INTO #TraceEvents VALUES (200,21,'QN: Parameter table');
|
||||
INSERT INTO #TraceEvents VALUES (201,21,'QN: Template');
|
||||
INSERT INTO #TraceEvents VALUES (202,21,'QN: Dynamics');
|
||||
INSERT INTO #TraceEvents VALUES (212,3,'Bitmap Warning');
|
||||
INSERT INTO #TraceEvents VALUES (213,3,'Database Suspect Data Page');
|
||||
INSERT INTO #TraceEvents VALUES (214,3,'CPU threshold exceeded');
|
||||
INSERT INTO #TraceEvents VALUES (215,10,'PreConnect:Starting');
|
||||
INSERT INTO #TraceEvents VALUES (216,10,'PreConnect:Completed');
|
||||
INSERT INTO #TraceEvents VALUES (217,6,'Plan Guide Successful');
|
||||
INSERT INTO #TraceEvents VALUES (218,6,'Plan Guide Unsuccessful');
|
||||
INSERT INTO #TraceEvents VALUES (235,8,'Audit Fulltext');
|
||||
-- Declare variables
|
||||
DECLARE @IntervalMinutes INT, @DateStart DATETIME, @DateEnd DATETIME, @TraceFile VARCHAR(200)
|
||||
CREATE TABLE #Info ([LogDate] DATETIME, [ProcessInfo] VARCHAR(1000), [Text] VARCHAR(7000))
|
||||
-- Set configuration values
|
||||
SET @IntervalMinutes = 1440
|
||||
SET @DateEnd = GETDATE()
|
||||
SET @DateStart = DATEADD(mi, -@IntervalMinutes, @DateEnd)
|
||||
-- Read error log
|
||||
IF @@VERSION LIKE 'Microsoft SQL Server 2000%'
|
||||
BEGIN
|
||||
CREATE TABLE #InfoTemp ([ErrorLog] VARCHAR(8000), [ContinuationRow] INT)
|
||||
INSERT INTO #InfoTemp EXEC [xp_readerrorlog]
|
||||
DELETE FROM #InfoTemp WHERE [ContinuationRow] = 1
|
||||
INSERT INTO #Info
|
||||
SELECT (CASE WHEN LEFT([ErrorLog], 1) = CHAR(9) THEN GETDATE() ELSE LEFT([ErrorLog], 22) END),
|
||||
(CASE WHEN LEFT([ErrorLog], 1) = CHAR(9) THEN '' ELSE RTRIM(LTRIM(SUBSTRING([ErrorLog], 23, 11))) END),
|
||||
(CASE WHEN LEFT([ErrorLog], 1) = CHAR(9) THEN ErrorLog ELSE RTRIM(LTRIM(SUBSTRING([ErrorLog], 34, LEN([ErrorLog]) - 34))) END)
|
||||
FROM #InfoTemp
|
||||
DELETE FROM #Info WHERE [LogDate] NOT BETWEEN @DateStart AND @DateEnd
|
||||
DROP TABLE #InfoTemp
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
INSERT INTO #Info EXEC [xp_readerrorlog] 0, 1, NULL, NULL, @DateStart, @DateEnd
|
||||
END
|
||||
-- Get trace file
|
||||
SELECT @TraceFile = CAST([value] AS NVARCHAR(1000))
|
||||
FROM ::fn_trace_getinfo(default)
|
||||
WHERE [traceid] = 1
|
||||
AND [property] = 2
|
||||
-- Read trace file
|
||||
IF @TraceFile <> ''
|
||||
BEGIN
|
||||
INSERT INTO #Info ([LogDate], [Text])
|
||||
SELECT MIN([ftg].[StartTime]), '['+ISNULL([ftg].[DatabaseName],'')+'] '+ISNULL([otn].[ObjectName],'')+' '+ISNULL(REPLACE([te].[name],'Object:',''),'')+' by '+ISNULL([ftg].[LoginName],'')+' with: '+ISNULL([ftg].[ApplicationName],'n/a')
|
||||
FROM ::fn_trace_gettable(@TraceFile, DEFAULT) [ftg]
|
||||
INNER JOIN #TraceEvents [te] ON [te].[trace_event_id] = [ftg].[EventClass]
|
||||
INNER JOIN #ObjectTypeName [otn] ON [otn].[ObjectType] = [ftg].[ObjectType]
|
||||
WHERE [ftg].[StartTime] BETWEEN @DateStart AND @DateEnd
|
||||
AND ISNULL([ftg].[ObjectType], 0) NOT IN (21587/*Statistics*/)
|
||||
AND NOT (ISNULL([ftg].[DatabaseID], 0) = 2/*TempDB*/ AND [ftg].[ObjectType] IN (8277/*User-Defined Table*/, 22601/*Index*/))
|
||||
GROUP BY '['+ISNULL([ftg].[DatabaseName],'')+'] '+ISNULL([otn].[ObjectName],'')+' '+ISNULL(REPLACE([te].[name],'Object:',''),'')+' by '+ISNULL([ftg].[LoginName],'')+' with: '+ISNULL([ftg].[ApplicationName],'n/a')
|
||||
END
|
||||
-- Delete exclusions
|
||||
DELETE [i] FROM #Info [i] INNER JOIN #ExclusionList [li] ON [i].[Text] LIKE '%'+[li].[stringValue]+'%'
|
||||
-- Read TempDB size
|
||||
IF @@VERSION LIKE 'Microsoft SQL Server 2000%'
|
||||
BEGIN
|
||||
IF (SELECT SUM([size]*8.0/1024) 'Current size in MB'
|
||||
FROM [tempdb].[dbo].[sysfiles])
|
||||
/
|
||||
(SELECT SUM([size]*8.0/1024) 'Initial size in MB'
|
||||
FROM [master].[dbo].[sysaltfiles]
|
||||
WHERE [dbid] = 2)
|
||||
> 2
|
||||
BEGIN
|
||||
INSERT INTO #Info ([LogDate], [Text])
|
||||
VALUES (GETDATE(), '[TempDB] current size more than twice greater of initial size')
|
||||
END
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
IF (SELECT SUM([size]*8.0/1024) 'Current size in MB'
|
||||
FROM [tempdb].[sys].[database_files])
|
||||
/
|
||||
(SELECT SUM([size]*8.0/1024) 'Initial size in MB'
|
||||
FROM [master].[sys].[sysaltfiles]
|
||||
WHERE [dbid] = 2)
|
||||
> 2
|
||||
BEGIN
|
||||
INSERT INTO #Info ([LogDate], [Text])
|
||||
VALUES (GETDATE(), '[TempDB] current size more than twice greater of initial size')
|
||||
END
|
||||
END
|
||||
-- Finish
|
||||
SELECT * FROM #Info ORDER BY [LogDate]
|
||||
DROP TABLE #Info
|
||||
-- Unload setup
|
||||
DROP TABLE #ExclusionList
|
||||
DROP TABLE #ObjectTypeName
|
||||
DROP TABLE #TraceEvents
|
||||
@@ -0,0 +1,109 @@
|
||||
Optymalizator zapytań
|
||||
|
||||
1. informacja o optymalzatorze
|
||||
select * from sys.dm_exec_query_optimizer_info
|
||||
|
||||
!! Pamiętajmy o czyszczeniu cache przed uruchomieniem zapytań żeby mieć pewność że zapytanie zostanie zoptymalizowane.
|
||||
|
||||
2. Zebranie informacji o optymalizacji
|
||||
|
||||
-- optymalizacja tych zapytań teraz,
|
||||
-- aby nie zaburzały zebranych danych
|
||||
GO
|
||||
SELECT *
|
||||
INTO after_query_optimizer_info
|
||||
FROM sys.dm_exec_query_optimizer_info
|
||||
GO
|
||||
SELECT *
|
||||
INTO before_query_optimizer_info
|
||||
FROM sys.dm_exec_query_optimizer_info
|
||||
GO
|
||||
DROP TABLE before_query_optimizer_info
|
||||
DROP TABLE after_query_optimizer_info
|
||||
GO
|
||||
-- rozpoczęcie właściwego wykonywania
|
||||
GO
|
||||
SELECT *
|
||||
INTO before_query_optimizer_info
|
||||
FROM sys.dm_exec_query_optimizer_info
|
||||
GO
|
||||
-- tutaj wstaw swoje zapytanie
|
||||
SELECT *
|
||||
FROM Person.Address
|
||||
-- zachowaj poniższe, aby wymusić nową optymalizację
|
||||
OPTION (RECOMPILE)
|
||||
GO
|
||||
SELECT *
|
||||
INTO after_query_optimizer_info
|
||||
FROM sys.dm_exec_query_optimizer_info
|
||||
GO
|
||||
SELECT a.counter,
|
||||
(a.occurrence - b.occurrence) AS occurrence,
|
||||
(a.occurrence * a.value - b.occurrence *
|
||||
b.value) AS value
|
||||
FROM before_query_optimizer_info b
|
||||
JOIN after_query_optimizer_info a
|
||||
ON b.counter = a.counter
|
||||
WHERE b.occurrence <> a.occurrence
|
||||
DROP TABLE before_query_optimizer_info
|
||||
DROP TABLE after_query_optimizer_info
|
||||
|
||||
3. Liczba transformacji zapytania
|
||||
|
||||
-- optymalizacja tych zapytań teraz,
|
||||
-- aby nie zaburzały zebranych danych
|
||||
GO
|
||||
SELECT *
|
||||
INTO before_query_transformation_stats
|
||||
FROM sys.dm_exec_query_transformation_stats
|
||||
GO
|
||||
SELECT *
|
||||
INTO after_query_transformation_stats
|
||||
FROM sys.dm_exec_query_transformation_stats
|
||||
GO
|
||||
DROP TABLE after_query_transformation_stats
|
||||
DROP TABLE before_query_transformation_stats
|
||||
-- rozpoczęcie właściwego wykonywania
|
||||
GO
|
||||
SELECT *
|
||||
INTO before_query_transformation_stats
|
||||
FROM sys.dm_exec_query_transformation_stats
|
||||
GO
|
||||
-- tutaj wstaw swoje zapytanie
|
||||
SELECT * FROM Sales.SalesOrderDetail
|
||||
WHERE SalesOrderID = 43659
|
||||
-- zachowaj poniższe, aby wymusić nową optymalizację
|
||||
OPTION (RECOMPILE)
|
||||
GO
|
||||
SELECT *
|
||||
INTO after_query_transformation_stats
|
||||
FROM sys.dm_exec_query_transformation_stats
|
||||
GO
|
||||
SELECT a.name, (a.promised - b.promised) as promised
|
||||
FROM before_query_transformation_stats b
|
||||
JOIN after_query_transformation_stats a
|
||||
ON b.name = a.name
|
||||
WHERE b.succeeded <> a.succeeded
|
||||
DROP TABLE before_query_transformation_stats
|
||||
DROP TABLE after_query_transformation_stats
|
||||
|
||||
4. Statystyki
|
||||
|
||||
- Możesz wykorzystać nieudokumentowane flagi 9292 i 9204 do wyświetlenia
|
||||
informacji o statystykach załadowanych podczas procesu optymalizacji. Uruchom
|
||||
zapytanie:
|
||||
|
||||
|
||||
OPTION (RECOMPILE, QUERYTRACEON 9292, QUERYTRACEON 9204)
|
||||
|
||||
|
||||
- Flagi 9292 można użyć do wyświetlenia obiektów statystyk uważanych za interesujące.
|
||||
Uruchom poniższe zapytanie:
|
||||
|
||||
OPTION (RECOMPILE, QUERYTRACEON 9292)
|
||||
|
||||
- Flagi 9204 można użyć do wyświetlenia obiektów statystyk, które zostały wykorzystane
|
||||
podczas szacowania kardynalności
|
||||
|
||||
OPTION (RECOMPILE, QUERYTRACEON 9204)
|
||||
|
||||
@@ -0,0 +1,243 @@
|
||||
1. sys.dm_exec_requests i sys.dm_exec_sessions - pokazuje jeszcze idąde zapytania
|
||||
|
||||
cpu_time Czas procesora w milisekundach wykorzystany przez żądanie lub przez żądania w sesji.
|
||||
total_elapsed_time Całkowity czas w milisekundach od odebrania żądania lub od początku sesji.
|
||||
reads Liczba odczytów wykonanych przez żądanie lub żądania w sesji.
|
||||
writes Liczba zapisów wykonanych przez żądanie lub żądania w sesji.
|
||||
logical_reads Liczba odczytów logicznych wykonanych przez żądanie lub żądania w sesji.
|
||||
row_count Liczba wierszy zwróconych do klienta na podstawie tego żądania.
|
||||
|
||||
SELECT cpu_time, reads, total_elapsed_time, logical_reads, row_count
|
||||
FROM sys.dm_exec_requests
|
||||
WHERE session_id = 56
|
||||
GO
|
||||
SELECT cpu_time, reads, total_elapsed_time, logical_reads, row_count
|
||||
FROM sys.dm_exec_sessions
|
||||
WHERE session_id = 56
|
||||
|
||||
2. sys.dm_exec_query_stats - zintegrowane informacje o wydajności
|
||||
|
||||
SELECT * FROM sys.dm_exec_query_stats
|
||||
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
|
||||
WHERE objectid = OBJECT_ID('dbo.test')
|
||||
|
||||
SELECT SUBSTRING(text, (statement_start_offset/2) + 1,
|
||||
((CASE statement_end_offset
|
||||
WHEN -1
|
||||
THEN DATALENGTH(text)
|
||||
ELSE
|
||||
statement_end_offset
|
||||
END
|
||||
- statement_start_offset)/2) + 1) AS statement_text, *
|
||||
FROM sys.dm_exec_query_stats
|
||||
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
|
||||
WHERE objectid = OBJECT_ID('dbo.test')
|
||||
|
||||
pokazuje tylko zakończone zapytania
|
||||
Opis kolumn
|
||||
total_worker_time Całkowity czas procesora w mikrosekundach (z dokładnością do milisekund)
|
||||
dla wszystkich wykonań planu od jego kompilacji.
|
||||
last_worker_time Czas procesora w mikrosekundach (z dokładnością do milisekund) dla ostatniego
|
||||
wykonania planu.
|
||||
min_worker_time Najkrótszy czas procesora w mikrosekundach (z dokładnością do milisekund) spośród
|
||||
wszystkich wykonań planu.
|
||||
max_worker_time Maksymalny czas procesora w mikrosekundach (z dokładnością do milisekund)
|
||||
spośród wszystkich wykonań planu.
|
||||
total_physical_reads Sumaryczna liczba odczytów fizycznych dla planu od czasu jego skompilowania.
|
||||
last_physical_reads Liczba odczytów fizycznych podczas ostatniego wykonania planu.
|
||||
min_physical_reads Minimalna liczba odczytów fizycznych spośród wszystkich wykonań planu.
|
||||
max_physical_reads Maksymalna liczba odczytów fizycznych spośród wszystkich wykonań planu.
|
||||
total_logical_writes Sumaryczna liczba zapisów logicznych dla planu od czasu jego skompilowania.
|
||||
last_logical_writes Liczba zapisów logicznych podczas ostatniego wykonania planu.
|
||||
min_logical_writes Minimalna liczba zapisów logicznych spośród wszystkich wykonań planu.
|
||||
max_logical_writes Maksymalna liczba zapisów logicznych spośród wszystkich wykonań planu.
|
||||
total_logical_reads Sumaryczna liczba odczytów logicznych dla planu od czasu jego skompilowania.
|
||||
last_logical_reads Liczba odczytów logicznych podczas ostatniego wykonania planu.
|
||||
min_logical_reads Minimalna liczba odczytów logicznych spośród wszystkich wykonań planu.
|
||||
max_logical_reads Maksymalna liczba odczytów logicznych spośród wszystkich wykonań planu.
|
||||
total_clr_time Czas w mikrosekundach (z dokładnością do milisekund) spędzony wewnątrz obiektów
|
||||
wspólnego środowiska uruchomieniowego (CLR) .NET Framework podczas wszystkich
|
||||
uruchomień tego planu od czasu jego kompilacji. Obiekty CLR mogą być procedurami
|
||||
przechowywanymi, funkcjami, wyzwalaczami, typami i agregacjami.
|
||||
last_clr_time Czas w mikrosekundach (z dokładnością do milisekund) spędzony wewnątrz obiektów
|
||||
CLR .NET Framework podczas ostatniego uruchomienia planu. Obiekty CLR mogą być
|
||||
procedurami przechowywanymi, funkcjami, wyzwalaczami, typami i agregacjami.
|
||||
min_clr_time Minimalny czas w mikrosekundach (z dokładnością do milisekund) spędzony wewnątrz
|
||||
obiektów CLR .NET Framework spośród wszystkich uruchomień planu. Obiekty CLR mogą
|
||||
być procedurami przechowywanymi, funkcjami, wyzwalaczami, typami i agregacjami.
|
||||
max_clr_time Maksymalny czas w mikrosekundach (z dokładnością do milisekund) spędzony wewnątrz
|
||||
obiektów CLR .NET Framework spośród wszystkich uruchomień planu. Obiekty CLR mogą
|
||||
total_elapsed_time Sumaryczny czas w mikrosekundach (z dokładnością do milisekund) dla wszystkich
|
||||
zakończonych uruchomień planu.
|
||||
last_elapsed_time Czas w mikrosekundach (z dokładnością do milisekund) dla ostatniego uruchomienia
|
||||
planu.
|
||||
min_elapsed_time Najkrótszy czas w mikrosekundach (z dokładnością do milisekunda) spośród wszystkich
|
||||
ukończonych uruchomień planu.
|
||||
max_elapsed_time Najdłuższy czas w mikrosekundach (z dokładnością do milisekunda) spośród wszystkich
|
||||
ukończonych uruchomień planu.
|
||||
|
||||
3. Szukanie kosztownych zapytań
|
||||
|
||||
SELECT TOP 20 query_stats.query_hash,
|
||||
SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count)
|
||||
AS avg_cpu_time,
|
||||
MIN(query_stats.statement_text) AS statement_text
|
||||
FROM
|
||||
(SELECT qs.*,
|
||||
SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
|
||||
((CASE statement_end_offset
|
||||
WHEN -1 THEN DATALENGTH(ST.text)
|
||||
ELSE qs.statement_end_offset END
|
||||
- qs.statement_start_offset)/2) + 1) AS statement_text
|
||||
FROM sys.dm_exec_query_stats qs
|
||||
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st) AS query_stats
|
||||
GROUP BY query_stats.query_hash
|
||||
ORDER BY avg_cpu_time DESC
|
||||
|
||||
SELECT TOP 20 query_plan_hash,
|
||||
SUM(total_worker_time) / SUM(execution_count) AS avg_cpu_time,
|
||||
MIN(plan_handle) AS plan_handle, MIN(text) AS query_text
|
||||
FROM sys.dm_exec_query_stats qs
|
||||
CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) AS st
|
||||
GROUP BY query_plan_hash
|
||||
ORDER BY avg_cpu_time DESC
|
||||
|
||||
Przykłady powyższe bazują na czasie procesora
|
||||
|
||||
Zaytanie zwraca najbardziej kosztowne zapytania
|
||||
SELECT TOP 20 SUBSTRING(st.text, (er.statement_start_offset/2) + 1,
|
||||
((CASE statement_end_offset
|
||||
WHEN -1
|
||||
THEN DATALENGTH(st.text)
|
||||
ELSE
|
||||
er.statement_end_offset
|
||||
END
|
||||
- er.statement_start_offset)/2) + 1) AS statement_text
|
||||
, *
|
||||
FROM sys.dm_exec_requests er
|
||||
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) st
|
||||
ORDER BY total_elapsed_time DESC
|
||||
|
||||
|
||||
4. Zdarzenia rozszerzone
|
||||
4.1 Lista zdarzeń jakie możemy monitorować
|
||||
SELECT name, description
|
||||
FROM sys.dm_xe_objects
|
||||
WHERE object_type = 'event' AND
|
||||
(capabilities & 1 = 0 OR capabilities IS NULL)
|
||||
ORDER BY name
|
||||
|
||||
--- tworzenie takiego trace
|
||||
|
||||
CREATE EVENT SESSION test ON SERVER
|
||||
ADD EVENT sqlserver.module_end(
|
||||
ACTION(sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,
|
||||
sqlserver.sql_text)),
|
||||
ADD EVENT sqlserver.rpc_completed(
|
||||
ACTION(sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,
|
||||
sqlserver.sql_text)),
|
||||
ADD EVENT sqlserver.sp_statement_completed(
|
||||
ACTION(sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,
|
||||
sqlserver.sql_text)),
|
||||
ADD EVENT sqlserver.sql_batch_completed(
|
||||
ACTION(sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,
|
||||
sqlserver.sql_text)),
|
||||
ADD EVENT sqlserver.sql_statement_completed(
|
||||
ACTION(sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,
|
||||
sqlserver.sql_text))
|
||||
ADD TARGET package0.ring_buffer
|
||||
WITH (STARTUP_STATE=OFF)
|
||||
|
||||
--- nie można zapomnieć o jej uruchomieniu
|
||||
|
||||
ALTER EVENT SESSION [test]
|
||||
ON SERVER
|
||||
STATE=START
|
||||
|
||||
|
||||
--- odczytanie danych ze zdarzeń, dane są w formacie XML
|
||||
|
||||
SELECT name, target_name, execution_count, CAST(target_data AS xml)
|
||||
AS target_data
|
||||
FROM sys.dm_xe_sessions s
|
||||
JOIN sys.dm_xe_session_targets t
|
||||
ON s.address = t.event_session_address
|
||||
WHERE s.name = 'test'
|
||||
|
||||
--- odpytanie XML żeby nie trzeba było za bardzo czytać XML
|
||||
|
||||
SELECT
|
||||
event_data.value('(event/@name)[1]', 'varchar(50)') AS event_name,
|
||||
event_data.value('(event/action[@name="query_hash"]/value)[1]','varchar(max)')
|
||||
AS query_hash,
|
||||
event_data.value('(event/data[@name="cpu_time"]/value)[1]', 'int')
|
||||
AS cpu_time,
|
||||
event_data.value('(event/data[@name="duration"]/value)[1]', 'int')
|
||||
AS duration,
|
||||
event_data.value('(event/data[@name="logical_reads"]/value)[1]', 'int')
|
||||
AS logical_reads,
|
||||
event_data.value('(event/data[@name="physical_reads"]/value)[1]', 'int')
|
||||
AS physical_reads,
|
||||
event_data.value('(event/data[@name="writes"]/value)[1]', 'int') AS writes,
|
||||
event_data.value('(event/data[@name="statement"]/value)[1]', 'varchar(max)')
|
||||
AS statement
|
||||
FROM(SELECT evnt.query('.') AS event_data
|
||||
FROM
|
||||
(SELECT CAST(target_data AS xml) AS target_data
|
||||
FROM sys.dm_xe_sessions s
|
||||
JOIN sys.dm_xe_session_targets t
|
||||
ON s.address = t.event_session_address
|
||||
WHERE s.name = 'test'
|
||||
AND t.target_name = 'ring_buffer'
|
||||
) AS data
|
||||
CROSS APPLY target_data.nodes('RingBufferTarget/event') AS xevent(evnt)
|
||||
) AS xevent(event_data)
|
||||
|
||||
--- powyższe zapytanie będzie nie bardzo czytelne można więc przerzucić dane do tabeli np SELECT INTO i wykonać poniższe zapytanie
|
||||
SELECT query_hash, SUM(cpu_time) AS cpu_time, SUM(duration) AS duration,
|
||||
SUM(logical_reads) AS logical_reads, SUM(physical_reads) AS physical_reads,
|
||||
SUM(writes) AS writes, MAX(statement) AS statement
|
||||
FROM #eventdata
|
||||
GROUP BY query_hash
|
||||
|
||||
--- po zakończeni analizy należy usunąć
|
||||
ALTER EVENT SESSION [test]
|
||||
ON SERVER
|
||||
STATE=STOP
|
||||
GO
|
||||
DROP EVENT SESSION [test] ON SERVER
|
||||
|
||||
--- Uruchomienie dla jednej sesji
|
||||
CREATE EVENT SESSION [test] ON SERVER
|
||||
ADD EVENT sqlos.wait_info(
|
||||
WHERE ([sqlserver].[session_id]=(61)))
|
||||
ADD TARGET package0.ring_buffer
|
||||
WITH (STARTUP_STATE=OFF)
|
||||
GO
|
||||
--- Uruchomienie zdarzenia:
|
||||
ALTER EVENT SESSION [test]
|
||||
ON SERVER
|
||||
STATE=START
|
||||
--- odczytanie tych danych
|
||||
SELECT
|
||||
event_data.value('(event/@name)[1]', 'varchar(50)') AS event_name,
|
||||
event_data.value('(event/data[@name="wait_type"]/text)[1]', 'varchar(40)')
|
||||
AS wait_type,
|
||||
event_data.value('(event/data[@name="duration"]/value)[1]', 'int')
|
||||
AS duration,
|
||||
event_data.value('(event/data[@name="opcode"]/text)[1]', 'varchar(40)')
|
||||
AS opcode,
|
||||
event_data.value('(event/data[@name="signal_duration"]/value)[1]', 'int')
|
||||
AS signal_duration
|
||||
FROM(SELECT evnt.query('.') AS event_data
|
||||
FROM
|
||||
(SELECT CAST(target_data AS xml) AS target_data
|
||||
FROM sys.dm_xe_sessions s
|
||||
JOIN sys.dm_xe_session_targets t
|
||||
ON s.address = t.event_session_address
|
||||
WHERE s.name = 'test'
|
||||
AND t.target_name = 'ring_buffer'
|
||||
) AS data
|
||||
CROSS APPLY target_data.nodes('RingBufferTarget/event') AS xevent(evnt)
|
||||
) AS xevent(event_data)
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
-- If you need more information, here is a nice SQL script, which I use from time to time:
|
||||
DECLARE @TabName varchar(100)
|
||||
|
||||
CREATE TABLE #temp (
|
||||
TabName varchar(200), IndexName varchar(200), IndexDescr varchar(200),
|
||||
IndexKeys varchar(200), IndexSize int
|
||||
)
|
||||
|
||||
DECLARE cur CURSOR FAST_FORWARD LOCAL FOR
|
||||
SELECT name FROM sysobjects WHERE xtype = 'U'
|
||||
|
||||
OPEN cur
|
||||
|
||||
FETCH NEXT FROM cur INTO @TabName
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
INSERT INTO #temp (IndexName, IndexDescr, IndexKeys)
|
||||
EXEC sp_helpindex @TabName
|
||||
|
||||
UPDATE #temp SET TabName = @TabName WHERE TabName IS NULL
|
||||
|
||||
FETCH NEXT FROM cur INTO @TabName
|
||||
END
|
||||
|
||||
CLOSE cur
|
||||
DEALLOCATE cur
|
||||
|
||||
DECLARE @ValueCoef int
|
||||
SELECT @ValueCoef = low FROM Master.dbo.spt_values WHERE number = 1 AND type = N'E'
|
||||
|
||||
UPDATE #temp SET IndexSize =
|
||||
((CAST(sysindexes.used AS bigint) * @ValueCoef)/1024)/1024
|
||||
FROM sysobjects INNER JOIN sysindexes ON sysobjects.id = sysindexes.id
|
||||
INNER JOIN #temp T ON T.TabName = sysobjects.name AND T.IndexName = sysindexes.name
|
||||
|
||||
SELECT * FROM #temp
|
||||
ORDER BY TabName, IndexName
|
||||
|
||||
DROP TABLE #temp
|
||||
@@ -0,0 +1,4 @@
|
||||
select * from sys.dm_db_index_usage_stats
|
||||
where-- object_id=399340487
|
||||
user_scans=0 and user_seeks=0 and user_lookups=0
|
||||
and database_id=40
|
||||
@@ -0,0 +1,144 @@
|
||||
-- tworzy skrypt do tworzenia indeksów,
|
||||
--bardzo przydatny do przenoszenia bazy wraz z obiektami albo do odgrywania brakujących indeksów
|
||||
|
||||
SELECT ' CREATE ' +
|
||||
CASE
|
||||
WHEN I.is_unique = 1 THEN ' UNIQUE '
|
||||
ELSE ''
|
||||
END +
|
||||
I.type_desc COLLATE DATABASE_DEFAULT + ' INDEX ' +
|
||||
I.name + ' ON ' +
|
||||
SCHEMA_NAME(T.schema_id) + '.' + T.name + ' ( ' +
|
||||
KeyColumns + ' ) ' +
|
||||
ISNULL(' INCLUDE (' + IncludedColumns + ' ) ', '') +
|
||||
ISNULL(' WHERE ' + I.filter_definition, '') + ' WITH ( ' +
|
||||
CASE
|
||||
WHEN I.is_padded = 1 THEN ' PAD_INDEX = ON '
|
||||
ELSE ' PAD_INDEX = OFF '
|
||||
END + ',' +
|
||||
'FILLFACTOR = ' + CONVERT(
|
||||
CHAR(5),
|
||||
CASE
|
||||
WHEN I.fill_factor = 0 THEN 100
|
||||
ELSE I.fill_factor
|
||||
END
|
||||
) + ',' +
|
||||
-- default value
|
||||
'SORT_IN_TEMPDB = OFF ' + ',' +
|
||||
CASE
|
||||
WHEN I.ignore_dup_key = 1 THEN ' IGNORE_DUP_KEY = ON '
|
||||
ELSE ' IGNORE_DUP_KEY = OFF '
|
||||
END + ',' +
|
||||
CASE
|
||||
WHEN ST.no_recompute = 0 THEN ' STATISTICS_NORECOMPUTE = OFF '
|
||||
ELSE ' STATISTICS_NORECOMPUTE = ON '
|
||||
END + ',' +
|
||||
' ONLINE = OFF ' + ',' +
|
||||
CASE
|
||||
WHEN I.allow_row_locks = 1 THEN ' ALLOW_ROW_LOCKS = ON '
|
||||
ELSE ' ALLOW_ROW_LOCKS = OFF '
|
||||
END + ',' +
|
||||
CASE
|
||||
WHEN I.allow_page_locks = 1 THEN ' ALLOW_PAGE_LOCKS = ON '
|
||||
ELSE ' ALLOW_PAGE_LOCKS = OFF '
|
||||
END + ' ) ON [' +
|
||||
DS.name + ' ] ' + CHAR(13) + CHAR(10) + ' GO' [CreateIndexScript]
|
||||
FROM sys.indexes I
|
||||
JOIN sys.tables T
|
||||
ON T.object_id = I.object_id
|
||||
JOIN sys.sysindexes SI
|
||||
ON I.object_id = SI.id
|
||||
AND I.index_id = SI.indid
|
||||
JOIN (
|
||||
SELECT *
|
||||
FROM (
|
||||
SELECT IC2.object_id,
|
||||
IC2.index_id,
|
||||
STUFF(
|
||||
(
|
||||
SELECT ' , ' + C.name + CASE
|
||||
WHEN MAX(CONVERT(INT, IC1.is_descending_key))
|
||||
= 1 THEN
|
||||
' DESC '
|
||||
ELSE
|
||||
' ASC '
|
||||
END
|
||||
FROM sys.index_columns IC1
|
||||
JOIN sys.columns C
|
||||
ON C.object_id = IC1.object_id
|
||||
AND C.column_id = IC1.column_id
|
||||
AND IC1.is_included_column =
|
||||
0
|
||||
WHERE IC1.object_id = IC2.object_id
|
||||
AND IC1.index_id = IC2.index_id
|
||||
GROUP BY
|
||||
IC1.object_id,
|
||||
C.name,
|
||||
index_id
|
||||
ORDER BY
|
||||
MAX(IC1.key_ordinal)
|
||||
FOR XML PATH('')
|
||||
),
|
||||
1,
|
||||
2,
|
||||
''
|
||||
) KeyColumns
|
||||
FROM sys.index_columns IC2
|
||||
--WHERE IC2.Object_id = object_id('Person.Address') --Comment for all tables
|
||||
GROUP BY
|
||||
IC2.object_id,
|
||||
IC2.index_id
|
||||
) tmp3
|
||||
)tmp4
|
||||
ON I.object_id = tmp4.object_id
|
||||
AND I.Index_id = tmp4.index_id
|
||||
JOIN sys.stats ST
|
||||
ON ST.object_id = I.object_id
|
||||
AND ST.stats_id = I.index_id
|
||||
JOIN sys.data_spaces DS
|
||||
ON I.data_space_id = DS.data_space_id
|
||||
JOIN sys.filegroups FG
|
||||
ON I.data_space_id = FG.data_space_id
|
||||
LEFT JOIN (
|
||||
SELECT *
|
||||
FROM (
|
||||
SELECT IC2.object_id,
|
||||
IC2.index_id,
|
||||
STUFF(
|
||||
(
|
||||
SELECT ' , ' + C.name
|
||||
FROM sys.index_columns IC1
|
||||
JOIN sys.columns C
|
||||
ON C.object_id = IC1.object_id
|
||||
AND C.column_id = IC1.column_id
|
||||
AND IC1.is_included_column =
|
||||
1
|
||||
WHERE IC1.object_id = IC2.object_id
|
||||
AND IC1.index_id = IC2.index_id
|
||||
GROUP BY
|
||||
IC1.object_id,
|
||||
C.name,
|
||||
index_id
|
||||
FOR XML PATH('')
|
||||
),
|
||||
1,
|
||||
2,
|
||||
''
|
||||
) IncludedColumns
|
||||
FROM sys.index_columns IC2
|
||||
--WHERE IC2.Object_id = object_id('Person.Address') --Comment for all tables
|
||||
GROUP BY
|
||||
IC2.object_id,
|
||||
IC2.index_id
|
||||
) tmp1
|
||||
WHERE IncludedColumns IS NOT NULL
|
||||
) tmp2
|
||||
ON tmp2.object_id = I.object_id
|
||||
AND tmp2.index_id = I.index_id
|
||||
WHERE I.is_primary_key = 0
|
||||
AND I.is_unique_constraint = 0
|
||||
--AND T.name NOT LIKE 'mt_%'
|
||||
--AND I.name NOT LIKE 'mt_%'
|
||||
--AND I.Object_id = object_id('Person.Address') --Comment for all tables
|
||||
--AND I.name = 'IX_Address_PostalCode' --comment for all indexes
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
select schema_name(o.schema_id) as [schema_name] ,
|
||||
object_name(o.object_id) as [table_name] ,
|
||||
i.name as [index_name] ,
|
||||
i.type_desc as [index_type] ,
|
||||
dmv.page_count ,
|
||||
dmv.fragment_count ,
|
||||
round(dmv.avg_fragment_size_in_pages, 2, 2) [avg_fragment_size_in_pages] ,
|
||||
round(dmv.avg_fragmentation_in_percent, 2, 2) [avg_fragmentation_in_percent] ,
|
||||
case when dmv.avg_fragmentation_in_percent <= 5 then 'RELAX'
|
||||
when dmv.avg_fragmentation_in_percent <= 30 then 'REORGANIZE'
|
||||
when dmv.avg_fragmentation_in_percent > 30 then 'REBUILD'
|
||||
end as [action] ,
|
||||
stats_date(dmv.object_id, i.index_id) as stats_update_date ,
|
||||
case when isnull(ps.function_id, 1) = 1 then 'NO'
|
||||
else 'YES'
|
||||
end as partitioned ,
|
||||
coalesce(fg.name, fgp.name) as [file_group_name] ,
|
||||
p.partition_number as [partition_number] ,
|
||||
p.rows as [partition_rows] ,
|
||||
prv_left.value as [partition_lower_boundary_value] ,
|
||||
prv_right.value as [partition_upper_boundary_value] ,
|
||||
case when pf.boundary_value_on_right = 1 then 'RIGHT'
|
||||
when pf.boundary_value_on_right = 0 then 'LEFT'
|
||||
else 'NONE'
|
||||
end as [partition_range] ,
|
||||
pf.name as [partition_function] ,
|
||||
ds.name as [partition_scheme]
|
||||
from sys.partitions as p with ( readpast )
|
||||
inner join sys.indexes as i with ( readpast ) on i.object_id = p.object_id
|
||||
and i.index_id = p.index_id
|
||||
inner join sys.objects as o with ( readpast ) on o.object_id = i.object_id
|
||||
inner join sys.dm_db_index_physical_stats(db_id(), null, null, null,
|
||||
N'LIMITED') dmv on dmv.OBJECT_ID = i.object_id
|
||||
and dmv.index_id = i.index_id
|
||||
and dmv.partition_number = p.partition_number
|
||||
left join sys.data_spaces as ds with ( readpast ) on ds.data_space_id = i.data_space_id
|
||||
left join sys.partition_schemes as ps with ( readpast ) on ps.data_space_id = ds.data_space_id
|
||||
left join sys.partition_functions as pf with ( readpast ) on pf.function_id = ps.function_id
|
||||
left join sys.destination_data_spaces as dds with ( readpast ) on dds.partition_scheme_id = ps.data_space_id
|
||||
and dds.destination_id = p.partition_number
|
||||
left join sys.filegroups as fg with ( readpast ) on fg.data_space_id = i.data_space_id
|
||||
left join sys.filegroups as fgp with ( readpast ) on fgp.data_space_id = dds.data_space_id
|
||||
left join sys.partition_range_values as prv_left with ( readpast ) on ps.function_id = prv_left.function_id
|
||||
and prv_left.boundary_id = p.partition_number
|
||||
- 1
|
||||
left join sys.partition_range_values as prv_right with ( readpast ) on ps.function_id = prv_right.function_id
|
||||
and prv_right.boundary_id = p.partition_number
|
||||
where objectproperty(p.object_id, 'ISMSShipped') = 0
|
||||
order by [avg_fragmentation_in_percent] DESC,
|
||||
[table_name] ,
|
||||
[index_name]
|
||||
@@ -0,0 +1,20 @@
|
||||
-- listuje indeksy które założone są w bazie danych
|
||||
select
|
||||
i.name as IndexName,
|
||||
o.name as TableName,
|
||||
ic.key_ordinal as ColumnOrder,
|
||||
ic.is_included_column as IsIncluded,
|
||||
co.[name] as ColumnName
|
||||
from sys.indexes i
|
||||
join sys.objects o on i.object_id = o.object_id
|
||||
join sys.index_columns ic on ic.object_id = i.object_id
|
||||
and ic.index_id = i.index_id
|
||||
join sys.columns co on co.object_id = i.object_id
|
||||
and co.column_id = ic.column_id
|
||||
where i.[type] = 2
|
||||
and i.is_unique = 0
|
||||
and i.is_primary_key = 0
|
||||
and o.[type] = 'U'
|
||||
--and ic.is_included_column = 0
|
||||
order by o.[name], i.[name], ic.is_included_column, ic.key_ordinal
|
||||
;
|
||||
@@ -0,0 +1,32 @@
|
||||
-- Missing Index Script
|
||||
-- Original Author: Pinal Dave
|
||||
SELECT TOP 25
|
||||
dm_mid.database_id AS DatabaseID,
|
||||
dm_migs.avg_user_impact*(dm_migs.user_seeks+dm_migs.user_scans) Avg_Estimated_Impact,
|
||||
dm_migs.last_user_seek AS Last_User_Seek,
|
||||
OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) AS [TableName],
|
||||
'CREATE INDEX [IX_' + OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) + '_'
|
||||
+ REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.equality_columns,''),', ','_'),'[',''),']','')
|
||||
+ CASE
|
||||
WHEN dm_mid.equality_columns IS NOT NULL
|
||||
AND dm_mid.inequality_columns IS NOT NULL THEN '_'
|
||||
ELSE ''
|
||||
END
|
||||
+ REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.inequality_columns,''),', ','_'),'[',''),']','')
|
||||
+ ']'
|
||||
+ ' ON ' + dm_mid.statement
|
||||
+ ' (' + ISNULL (dm_mid.equality_columns,'')
|
||||
+ CASE WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns
|
||||
IS NOT NULL THEN ',' ELSE
|
||||
'' END
|
||||
+ ISNULL (dm_mid.inequality_columns, '')
|
||||
+ ')'
|
||||
+ ISNULL (' INCLUDE (' + dm_mid.included_columns + ')', '') AS Create_Statement
|
||||
FROM sys.dm_db_missing_index_groups dm_mig
|
||||
INNER JOIN sys.dm_db_missing_index_group_stats dm_migs
|
||||
ON dm_migs.group_handle = dm_mig.index_group_handle
|
||||
INNER JOIN sys.dm_db_missing_index_details dm_mid
|
||||
ON dm_mig.index_handle = dm_mid.index_handle
|
||||
WHERE dm_mid.database_ID = DB_ID()
|
||||
ORDER BY Avg_Estimated_Impact DESC
|
||||
GO
|
||||
@@ -0,0 +1,31 @@
|
||||
-- Script - Find Details for Statistics of Whole Database
|
||||
-- (c) Pinal Dave
|
||||
-- Download Script from - http://go.sqlauthority.com
|
||||
SELECT DISTINCT
|
||||
OBJECT_NAME(s.[object_id]) AS TableName,
|
||||
c.name AS ColumnName,
|
||||
s.name AS StatName,
|
||||
STATS_DATE(s.[object_id], s.stats_id) AS LastUpdated,
|
||||
DATEDIFF(d,STATS_DATE(s.[object_id], s.stats_id),getdate()) DaysOld,
|
||||
dsp.modification_counter,
|
||||
s.auto_created,
|
||||
s.user_created,
|
||||
s.no_recompute,
|
||||
s.[object_id],
|
||||
s.stats_id,
|
||||
sc.stats_column_id,
|
||||
sc.column_id
|
||||
FROM sys.stats s
|
||||
JOIN sys.stats_columns sc
|
||||
ON sc.[object_id] = s.[object_id] AND sc.stats_id = s.stats_id
|
||||
JOIN sys.columns c ON c.[object_id] = sc.[object_id] AND c.column_id = sc.column_id
|
||||
JOIN sys.partitions par ON par.[object_id] = s.[object_id]
|
||||
JOIN sys.objects obj ON par.[object_id] = obj.[object_id]
|
||||
CROSS APPLY sys.dm_db_stats_properties(sc.[object_id], s.stats_id) AS dsp
|
||||
WHERE OBJECTPROPERTY(s.OBJECT_ID,'IsUserTable') = 1
|
||||
AND (s.auto_created = 1 OR s.user_created = 1)
|
||||
ORDER BY DaysOld;
|
||||
|
||||
|
||||
EXEC sp_updatestats;
|
||||
GO
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
Wyświetla wszystkie Page Latch w bazie danych
|
||||
*/
|
||||
|
||||
select q.text, r.status, r.wait_type, r.wait_resource, r.wait_time from
|
||||
sys.dm_exec_requests r
|
||||
inner join sys.dm_exec_sessions s
|
||||
on s.session_id=r.session_id
|
||||
cross apply sys.dm_exec_sql_text(r.sql_handle) q
|
||||
where s.is_user_process=1
|
||||
and r.status<>'running'
|
||||
and r.wait_type like 'PAGELATCH%'
|
||||
order by r.wait_resource
|
||||
|
||||
-- sprawdzenie potem co jest w ym bloku
|
||||
|
||||
dbcc page(40, 43, 14988552, 3) with tableresults
|
||||
|
||||
-- jeśli to jest index to sprawdzamy który to jest
|
||||
|
||||
select * from sys.indexes
|
||||
where object_id=399340487
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
-- pokazuje tylko sesje ktore wykonuja zapis do bazy danych
|
||||
SELECT * FROM
|
||||
sys.dm_exec_sessions
|
||||
WHERE is_user_process = 1
|
||||
AND writes > 0;
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
DECLARE @databaseName sysname
|
||||
DECLARE @backupStartDate datetime
|
||||
DECLARE @backup_set_id_start INT
|
||||
DECLARE @backup_set_id_end INT
|
||||
|
||||
-- set database to be used
|
||||
SET @databaseName = 'enterDatabaseNameHere'
|
||||
|
||||
SELECT @backup_set_id_start = MAX(backup_set_id)
|
||||
FROM msdb.dbo.backupset
|
||||
WHERE database_name = @databaseName AND type = 'D'
|
||||
|
||||
SELECT @backup_set_id_end = MIN(backup_set_id)
|
||||
FROM msdb.dbo.backupset
|
||||
WHERE database_name = @databaseName AND type = 'D'
|
||||
AND backup_set_id > @backup_set_id_start
|
||||
|
||||
IF @backup_set_id_end IS NULL SET @backup_set_id_end = 999999999
|
||||
|
||||
SELECT backup_set_id, 'RESTORE DATABASE ' + @databaseName + ' FROM DISK = ''' + mf.physical_device_name + ''' WITH NORECOVERY'
|
||||
FROM msdb.dbo.backupset b,
|
||||
msdb.dbo.backupmediafamily mf
|
||||
WHERE b.media_set_id = mf.media_set_id
|
||||
AND b.database_name = @databaseName
|
||||
AND b.backup_set_id = @backup_set_id_start
|
||||
UNION
|
||||
SELECT backup_set_id, 'RESTORE LOG ' + @databaseName + ' FROM DISK = ''' + mf.physical_device_name + ''' WITH NORECOVERY'
|
||||
FROM msdb.dbo.backupset b,
|
||||
msdb.dbo.backupmediafamily mf
|
||||
WHERE b.media_set_id = mf.media_set_id
|
||||
AND b.database_name = @databaseName
|
||||
AND b.backup_set_id >= @backup_set_id_start AND b.backup_set_id < @backup_set_id_end
|
||||
AND b.type = 'L'
|
||||
UNION
|
||||
SELECT 999999999 AS backup_set_id, 'RESTORE DATABASE ' + @databaseName + ' WITH RECOVERY'
|
||||
ORDER BY backup_set_id
|
||||
@@ -0,0 +1,3 @@
|
||||
# Wstęp
|
||||
|
||||
- sex_guest_account_check - są skryptami sprawdzającymi jakie upbrawnienia mają uzytkownicy w poszczególnych bazach danycj, skrypty nie modyfikują żadnych danych.
|
||||
@@ -0,0 +1,135 @@
|
||||
USE master
|
||||
GO
|
||||
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
|
||||
DROP PROCEDURE sp_hexadecimal
|
||||
GO
|
||||
CREATE PROCEDURE sp_hexadecimal
|
||||
@binvalue varbinary(256),
|
||||
@hexvalue varchar (514) OUTPUT
|
||||
AS
|
||||
DECLARE @charvalue varchar (514)
|
||||
DECLARE @i int
|
||||
DECLARE @length int
|
||||
DECLARE @hexstring char(16)
|
||||
SELECT @charvalue = '0x'
|
||||
SELECT @i = 1
|
||||
SELECT @length = DATALENGTH (@binvalue)
|
||||
SELECT @hexstring = '0123456789ABCDEF'
|
||||
WHILE (@i <= @length)
|
||||
BEGIN
|
||||
DECLARE @tempint int
|
||||
DECLARE @firstint int
|
||||
DECLARE @secondint int
|
||||
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
|
||||
SELECT @firstint = FLOOR(@tempint/16)
|
||||
SELECT @secondint = @tempint - (@firstint*16)
|
||||
SELECT @charvalue = @charvalue +
|
||||
SUBSTRING(@hexstring, @firstint+1, 1) +
|
||||
SUBSTRING(@hexstring, @secondint+1, 1)
|
||||
SELECT @i = @i + 1
|
||||
END
|
||||
|
||||
SELECT @hexvalue = @charvalue
|
||||
GO
|
||||
|
||||
IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
|
||||
DROP PROCEDURE sp_help_revlogin
|
||||
GO
|
||||
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
|
||||
DECLARE @name sysname
|
||||
DECLARE @type varchar (1)
|
||||
DECLARE @hasaccess int
|
||||
DECLARE @denylogin int
|
||||
DECLARE @is_disabled int
|
||||
DECLARE @PWD_varbinary varbinary (256)
|
||||
DECLARE @PWD_string varchar (514)
|
||||
DECLARE @SID_varbinary varbinary (85)
|
||||
DECLARE @SID_string varchar (514)
|
||||
DECLARE @tmpstr varchar (1024)
|
||||
DECLARE @is_policy_checked varchar (3)
|
||||
DECLARE @is_expiration_checked varchar (3)
|
||||
|
||||
DECLARE @defaultdb sysname
|
||||
|
||||
IF (@login_name IS NULL)
|
||||
DECLARE login_curs CURSOR FOR
|
||||
|
||||
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
|
||||
sys.server_principals p LEFT JOIN sys.syslogins l
|
||||
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
|
||||
ELSE
|
||||
DECLARE login_curs CURSOR FOR
|
||||
|
||||
|
||||
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
|
||||
sys.server_principals p LEFT JOIN sys.syslogins l
|
||||
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
|
||||
OPEN login_curs
|
||||
|
||||
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
|
||||
IF (@@fetch_status = -1)
|
||||
BEGIN
|
||||
PRINT 'No login(s) found.'
|
||||
CLOSE login_curs
|
||||
DEALLOCATE login_curs
|
||||
RETURN -1
|
||||
END
|
||||
SET @tmpstr = '/* sp_help_revlogin script '
|
||||
PRINT @tmpstr
|
||||
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
|
||||
PRINT @tmpstr
|
||||
PRINT ''
|
||||
WHILE (@@fetch_status <> -1)
|
||||
BEGIN
|
||||
IF (@@fetch_status <> -2)
|
||||
BEGIN
|
||||
PRINT ''
|
||||
SET @tmpstr = '-- Login: ' + @name
|
||||
PRINT @tmpstr
|
||||
IF (@type IN ( 'G', 'U'))
|
||||
BEGIN -- NT authenticated account/group
|
||||
|
||||
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
|
||||
END
|
||||
ELSE BEGIN -- SQL Server authentication
|
||||
-- obtain password and sid
|
||||
SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
|
||||
EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
|
||||
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
|
||||
|
||||
-- obtain password policy state
|
||||
SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
|
||||
SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
|
||||
|
||||
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
|
||||
|
||||
IF ( @is_policy_checked IS NOT NULL )
|
||||
BEGIN
|
||||
SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
|
||||
END
|
||||
IF ( @is_expiration_checked IS NOT NULL )
|
||||
BEGIN
|
||||
SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
|
||||
END
|
||||
END
|
||||
IF (@denylogin = 1)
|
||||
BEGIN -- login is denied access
|
||||
SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
|
||||
END
|
||||
ELSE IF (@hasaccess = 0)
|
||||
BEGIN -- login exists but does not have access
|
||||
SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
|
||||
END
|
||||
IF (@is_disabled = 1)
|
||||
BEGIN -- login is disabled
|
||||
SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
|
||||
END
|
||||
PRINT @tmpstr
|
||||
END
|
||||
|
||||
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
|
||||
END
|
||||
CLOSE login_curs
|
||||
DEALLOCATE login_curs
|
||||
RETURN 0
|
||||
GO
|
||||
@@ -0,0 +1,316 @@
|
||||
set nocount off
|
||||
|
||||
IF OBJECT_ID(N'tempdb..##temp1') IS NOT NULL
|
||||
DROP TABLE ##temp1
|
||||
|
||||
create table ##temp1(query varchar(1000))
|
||||
|
||||
insert into ##temp1
|
||||
select 'use '+db_name() +';'
|
||||
|
||||
insert into ##temp1
|
||||
select 'go'
|
||||
|
||||
/*creating database roles*/
|
||||
insert into ##temp1
|
||||
select 'if DATABASE_PRINCIPAL_ID('''+name+''') is null
|
||||
exec sp_addrole '''+name+'''' from sysusers
|
||||
where issqlrole = 1 and (sid is not null and sid <> 0x0)
|
||||
|
||||
/*creating application roles*/
|
||||
insert into ##temp1
|
||||
select 'if DATABASE_PRINCIPAL_ID('+char(39)+name+char(39)+')
|
||||
is null CREATE APPLICATION ROLE ['+name+'] WITH DEFAULT_SCHEMA = ['+
|
||||
default_schema_name+'], Password='+char(39)+'Pass$w0rd123'+char(39)+' ;'
|
||||
from sys.database_principals
|
||||
where type_desc='APPLICATION_ROLE'
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' to '+'['+USER_NAME(grantee_principal_id)+']'+' WITH GRANT OPTION ;'
|
||||
|
||||
else
|
||||
state_desc+' '+permission_name+' to '+'['+USER_NAME(grantee_principal_id)+']'+' ;'
|
||||
END
|
||||
from sys.database_permissions
|
||||
where class=0 and USER_NAME(grantee_principal_id) not in ('dbo','guest','sys','information_schema')
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' on '+OBJECT_SCHEMA_NAME(major_id)+'.['+OBJECT_NAME(major_id)
|
||||
+'] to '+'['+USER_NAME(grantee_principal_id)+']'+' with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' on '+OBJECT_SCHEMA_NAME(major_id)+'.['+OBJECT_NAME(major_id)
|
||||
+'] to '+'['+USER_NAME(grantee_principal_id)+']'+' ;'
|
||||
end
|
||||
from sys.database_permissions where class=1 and USER_NAME(grantee_principal_id) not in ('public');
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON schema::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON schema::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.schemas sa on
|
||||
sa.schema_id = dp.major_id where dp.class=3
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON APPLICATION ROLE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON APPLICATION ROLE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.database_principals sa on
|
||||
sa.principal_id = dp.major_id where dp.class=4 and sa.type='A'
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON ROLE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON ROLE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join
|
||||
sys.database_principals sa on sa.principal_id = dp.major_id
|
||||
where dp.class=4 and sa.type='R'
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON ASSEMBLY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON ASSEMBLY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.assemblies sa on
|
||||
sa.assembly_id = dp.major_id
|
||||
where dp.class=5
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON type::['
|
||||
+SCHEMA_NAME(schema_id)+'].['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON type::['
|
||||
+SCHEMA_NAME(schema_id)+'].['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.types sa on
|
||||
sa.user_type_id = dp.major_id
|
||||
where dp.class=6
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON XML SCHEMA COLLECTION::['+
|
||||
SCHEMA_NAME(SCHEMA_ID)+'].['+sa.name+'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON XML SCHEMA COLLECTION::['+
|
||||
SCHEMA_NAME(SCHEMA_ID)+'].['+sa.name+'] to ['+user_name(dp.grantee_principal_id)+'];'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.xml_schema_collections sa on
|
||||
sa.xml_collection_id = dp.major_id
|
||||
where dp.class=10
|
||||
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON message type::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON message type::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.service_message_types sa on
|
||||
sa.message_type_id = dp.major_id
|
||||
where dp.class=15
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON contract::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON contract::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.service_contracts sa on
|
||||
sa.service_contract_id = dp.major_id
|
||||
where dp.class=16
|
||||
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON SERVICE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON SERVICE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.services sa on
|
||||
sa.service_id = dp.major_id
|
||||
where dp.class=17
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON REMOTE SERVICE BINDING::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON REMOTE SERVICE BINDING::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.remote_service_bindings sa on
|
||||
sa.remote_service_binding_id = dp.major_id
|
||||
where dp.class=18
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON route::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON route::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.routes sa on
|
||||
sa.route_id = dp.major_id
|
||||
where dp.class=19
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON FULLTEXT CATALOG::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON FULLTEXT CATALOG::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.fulltext_catalogs sa on
|
||||
sa.fulltext_catalog_id = dp.major_id
|
||||
where dp.class=23
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON SYMMETRIC KEY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON SYMMETRIC KEY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.symmetric_keys sa on
|
||||
sa.symmetric_key_id = dp.major_id
|
||||
where dp.class=24
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON certificate::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON certificate::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.certificates sa on
|
||||
sa.certificate_id = dp.major_id
|
||||
where dp.class=25
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON ASYMMETRIC KEY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON ASYMMETRIC KEY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.asymmetric_keys sa on
|
||||
sa.asymmetric_key_id = dp.major_id
|
||||
where dp.class=26
|
||||
|
||||
insert into ##temp1
|
||||
select 'exec sp_addrolemember ''' +p.NAME+''','+'['+m.NAME+']'+' ;'
|
||||
FROM sys.database_role_members rm
|
||||
JOIN sys.database_principals p
|
||||
ON rm.role_principal_id = p.principal_id
|
||||
JOIN sys.database_principals m
|
||||
ON rm.member_principal_id = m.principal_id
|
||||
where m.name not like 'dbo';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
select * from ##temp1
|
||||
@@ -0,0 +1,41 @@
|
||||
--guest users
|
||||
USE master;
|
||||
GO
|
||||
if not exists (select name from sys.databases where name = 'SQLAdmin')
|
||||
create database SQLAdmin
|
||||
go
|
||||
declare @name sysname
|
||||
declare @cmd varchar(4000)
|
||||
DECLARE databases_cursor CURSOR FOR
|
||||
SELECT name FROM sys.databases where state in (0)
|
||||
order by name
|
||||
|
||||
create table #guest_users (
|
||||
database_name sysname, principal_name sysname, permission_name nvarchar(128), state_desc nvarchar(6)
|
||||
)
|
||||
|
||||
OPEN databases_cursor;
|
||||
|
||||
FETCH NEXT FROM databases_cursor into @name;
|
||||
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
set @cmd = 'use ' + @name + ';
|
||||
insert into #guest_users
|
||||
SELECT ''' + @name + ''' as database_name, name, permission_name, state_desc
|
||||
FROM sys.database_principals dpr
|
||||
INNER JOIN sys.database_permissions dpe
|
||||
ON dpr.principal_id = dpe.grantee_principal_id
|
||||
WHERE name = ''guest'' AND permission_name = ''CONNECT''
|
||||
'
|
||||
exec (@cmd)
|
||||
FETCH NEXT FROM databases_cursor into @name;
|
||||
END
|
||||
|
||||
select * from #guest_users order by database_name asc
|
||||
|
||||
drop table #guest_users
|
||||
|
||||
CLOSE databases_cursor;
|
||||
DEALLOCATE databases_cursor;
|
||||
GO
|
||||
@@ -0,0 +1,25 @@
|
||||
SET NOCOUNT ON
|
||||
GO
|
||||
DECLARE @DBName VARCHAR(255)
|
||||
DECLARE @SQL VARCHAR(MAX)
|
||||
DECLARE @SQLEXEC VARCHAR(MAX)
|
||||
CREATE TABLE #TableVar (DatabaseName varchar(256), permission_name varchar(32), State_desc varchar(10))
|
||||
DECLARE curDatabases CURSOR STATIC FOR
|
||||
SELECT [name]
|
||||
FROM master.sys.databases
|
||||
WHERE database_id > 4
|
||||
ORDER BY [name]
|
||||
OPEN curDatabases
|
||||
FETCH NEXT FROM curDatabases INTO @DBName
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
SET @SQL = 'insert into #TableVar SELECT DB_NAME() as DatabaseName,permission_name,state_desc FROM sys.database_permissions where grantee_principal_id = user_id(''''guest'''') AND state = ''''G'''' AND type = ''''CO'''' '
|
||||
SET @SQLEXEC = 'USE ' + QUOTENAME(@DBName) + ';EXEC (''' + @SQL +''')'
|
||||
EXEC(@SQLEXEC)
|
||||
FETCH NEXT FROM curDatabases INTO @DBName
|
||||
END
|
||||
CLOSE curDatabases
|
||||
DEALLOCATE curDatabases
|
||||
Select * from #TableVar
|
||||
Drop table #TableVar
|
||||
GO
|
||||
@@ -0,0 +1,12 @@
|
||||
SELECT
|
||||
event_time ,
|
||||
session_server_principal_name AS UserName ,
|
||||
server_instance_name ,
|
||||
database_name ,
|
||||
object_name ,
|
||||
statement
|
||||
FROM sys.fn_get_audit_file('C:\AUDITs\*.sqlaudit', DEFAULT, DEFAULT)
|
||||
WHERE
|
||||
action_id = 'SL'
|
||||
AND
|
||||
database_name = 'ACMEDB';
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,14 @@
|
||||
SELECT
|
||||
serverproperty('ComputerNamePhysicalNetBIOS') as HostName,
|
||||
D.name,
|
||||
F.Name AS FileType,
|
||||
F.physical_name AS PhysicalFile,
|
||||
F.state_desc AS OnlineStatus,
|
||||
type_desc,
|
||||
CAST((F.size*8)/1024 AS VARCHAR(26)) + ' MB' AS FileSize,
|
||||
CAST(F.size*8 AS VARCHAR(32)) + ' Bytes' as SizeInBytes
|
||||
FROM
|
||||
sys.master_files F
|
||||
INNER JOIN sys.databases D ON D.database_id = F.database_id
|
||||
ORDER BY
|
||||
D.name
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
|
||||
SELECT
|
||||
DB.name,
|
||||
SUM(CASE WHEN type = 0 THEN MF.size * 8 / 1024 ELSE 0 END) AS DataFileSizeMB,
|
||||
SUM(CASE WHEN type = 1 THEN MF.size * 8 / 1024 ELSE 0 END) AS LogFileSizeMB
|
||||
FROM
|
||||
sys.master_files MF
|
||||
JOIN sys.databases DB ON DB.database_id = MF.database_id
|
||||
GROUP BY DB.name
|
||||
ORDER BY DataFileSizeMB DESC
|
||||
|
||||
|
||||
|
||||
SELECT
|
||||
D.name,
|
||||
F.Name AS FileType,
|
||||
F.physical_name AS PhysicalFile,
|
||||
F.state_desc AS OnlineStatus,
|
||||
CAST((F.size*8)/1024 AS VARCHAR(26)) + ' MB' AS FileSize,
|
||||
CAST(F.size*8 AS VARCHAR(32)) + ' Bytes' as SizeInBytes
|
||||
FROM
|
||||
sys.master_files F
|
||||
INNER JOIN sys.databases D ON D.database_id = F.database_id
|
||||
ORDER BY
|
||||
D.name
|
||||
@@ -0,0 +1,34 @@
|
||||
SELECT
|
||||
DB_NAME(db.database_id) DatabaseName,
|
||||
(CAST(mfrows.RowSize AS FLOAT)*8)/1024 RowSizeMB,
|
||||
(CAST(mflog.LogSize AS FLOAT)*8)/1024 LogSizeMB,
|
||||
(CAST(mfrows.RowSize AS FLOAT)*8)/1024/1024+(CAST(mflog.LogSize AS FLOAT)*8)/1024/1024 DBSizeG,
|
||||
(CAST(mfstream.StreamSize AS FLOAT)*8)/1024 StreamSizeMB,
|
||||
(CAST(mftext.TextIndexSize AS FLOAT)*8)/1024 TextIndexSizeMB
|
||||
FROM sys.databases db
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) RowSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 0
|
||||
GROUP BY database_id, type) mfrows
|
||||
ON mfrows.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) LogSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 1
|
||||
GROUP BY database_id, type) mflog
|
||||
ON mflog.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) StreamSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 2
|
||||
GROUP BY database_id, type) mfstream
|
||||
ON mfstream.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) TextIndexSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 4
|
||||
GROUP BY database_id, type) mftext
|
||||
ON mftext.database_id = db.database_id
|
||||
ORDER BY 4 DESC
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
SELECT
|
||||
DB_NAME(db.database_id) DatabaseName,
|
||||
(CAST(mfrows.RowSize AS FLOAT)*8)/1024 RowSizeMB,
|
||||
(CAST(mflog.LogSize AS FLOAT)*8)/1024 LogSizeMB,
|
||||
(CAST(mfstream.StreamSize AS FLOAT)*8)/1024 StreamSizeMB,
|
||||
(CAST(mftext.TextIndexSize AS FLOAT)*8)/1024 TextIndexSizeMB
|
||||
FROM sys.databases db
|
||||
LEFT JOIN (SELECT database_id, SUM(size) RowSize FROM sys.master_files WHERE type = 0 GROUP BY database_id, type) mfrows ON mfrows.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id, SUM(size) LogSize FROM sys.master_files WHERE type = 1 GROUP BY database_id, type) mflog ON mflog.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id, SUM(size) StreamSize FROM sys.master_files WHERE type = 2 GROUP BY database_id, type) mfstream ON mfstream.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id, SUM(size) TextIndexSize FROM sys.master_files WHERE type = 4 GROUP BY database_id, type) mftext ON mftext.database_id = db.database_id
|
||||
@@ -0,0 +1,5 @@
|
||||
SELECT DB_NAME(database_id) AS DatabaseName,
|
||||
Name AS Logical_Name,
|
||||
Physical_Name, (size*8)/1024 SizeMB, growth
|
||||
FROM sys.master_files
|
||||
where (size*8)/1024/1024 > 55 and max_size = -1 and growth > 0
|
||||
@@ -0,0 +1,5 @@
|
||||
SELECT DB_NAME(database_id) AS DatabaseName,
|
||||
Name AS Logical_Name,
|
||||
Physical_Name, (size*8)/1024 SizeMB, (growth*8)/1024 GrowthMB
|
||||
FROM sys.master_files
|
||||
where (size*8)/1024/1024 > 55 and max_size = -1 and growth > 0
|
||||
@@ -0,0 +1,2 @@
|
||||
use master
|
||||
select count(*) from sysdatabases where name not in ('master','tempdb','model','msdb','IBM')
|
||||
@@ -0,0 +1,34 @@
|
||||
SELECT
|
||||
DB_NAME(db.database_id) DatabaseName,
|
||||
(CAST(mfrows.RowSize AS FLOAT)*8)/1024 RowSizeMB,
|
||||
(CAST(mflog.LogSize AS FLOAT)*8)/1024 LogSizeMB,
|
||||
(CAST(mfrows.RowSize AS FLOAT)*8)/1024/1024+(CAST(mflog.LogSize AS FLOAT)*8)/1024/1024 DBSizeG,
|
||||
(CAST(mfstream.StreamSize AS FLOAT)*8)/1024 StreamSizeMB,
|
||||
(CAST(mftext.TextIndexSize AS FLOAT)*8)/1024 TextIndexSizeMB
|
||||
FROM sys.databases db
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) RowSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 0
|
||||
GROUP BY database_id, type) mfrows
|
||||
ON mfrows.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) LogSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 1
|
||||
GROUP BY database_id, type) mflog
|
||||
ON mflog.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) StreamSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 2
|
||||
GROUP BY database_id, type) mfstream
|
||||
ON mfstream.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) TextIndexSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 4
|
||||
GROUP BY database_id, type) mftext
|
||||
ON mftext.database_id = db.database_id
|
||||
ORDER BY 4 DESC
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
HostName name FileType PhysicalFile OnlineStatus type_desc FileSize SizeInBytes
|
||||
DESKTOP-NG9J589 DBATools DBATools C:\MSSQL\MSSQL14.MSSQLSERVER\MSSQL\DATA\DBATools.mdf ONLINE ROWS 8 MB 8192 Bytes
|
||||
**/
|
||||
|
||||
SELECT
|
||||
serverproperty('ComputerNamePhysicalNetBIOS') as HostName,
|
||||
D.name,
|
||||
F.Name AS FileType,
|
||||
F.physical_name AS PhysicalFile,
|
||||
F.state_desc AS OnlineStatus,
|
||||
type_desc,
|
||||
CAST((F.size*8)/1024 AS VARCHAR(26)) + ' MB' AS FileSize,
|
||||
CAST(F.size*8 AS VARCHAR(32)) + ' Bytes' as SizeInBytes
|
||||
FROM
|
||||
sys.master_files F
|
||||
INNER JOIN sys.databases D ON D.database_id = F.database_id
|
||||
ORDER BY
|
||||
D.name
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
|
||||
SELECT
|
||||
DB.name,
|
||||
SUM(CASE WHEN type = 0 THEN MF.size * 8 / 1024 ELSE 0 END) AS DataFileSizeMB,
|
||||
SUM(CASE WHEN type = 1 THEN MF.size * 8 / 1024 ELSE 0 END) AS LogFileSizeMB
|
||||
FROM
|
||||
sys.master_files MF
|
||||
JOIN sys.databases DB ON DB.database_id = MF.database_id
|
||||
GROUP BY DB.name
|
||||
ORDER BY DataFileSizeMB DESC
|
||||
|
||||
|
||||
|
||||
SELECT
|
||||
D.name,
|
||||
F.Name AS FileType,
|
||||
F.physical_name AS PhysicalFile,
|
||||
F.state_desc AS OnlineStatus,
|
||||
CAST((F.size*8)/1024 AS VARCHAR(26)) + ' MB' AS FileSize,
|
||||
CAST(F.size*8 AS VARCHAR(32)) + ' Bytes' as SizeInBytes
|
||||
FROM
|
||||
sys.master_files F
|
||||
INNER JOIN sys.databases D ON D.database_id = F.database_id
|
||||
ORDER BY
|
||||
D.name
|
||||
@@ -0,0 +1,15 @@
|
||||
SELECT Drive
|
||||
, TotalSpaceGB
|
||||
, FreeSpaceGB
|
||||
, PctFree
|
||||
, PctFreeExact
|
||||
FROM
|
||||
(SELECT DISTINCT
|
||||
SUBSTRING(dovs.volume_mount_point, 1, 10) AS Drive
|
||||
, CONVERT(INT, dovs.total_bytes / 1024.0 / 1024.0 / 1024.0) AS TotalSpaceGB
|
||||
, CONVERT(INT, dovs.available_bytes / 1048576.0) / 1024 AS FreeSpaceGB
|
||||
, CAST(ROUND(( CONVERT(FLOAT, dovs.available_bytes / 1048576.0) / CONVERT(FLOAT, dovs.total_bytes / 1024.0 /
|
||||
1024.0) * 100 ), 2) AS NVARCHAR(50)) + '%' AS PctFree
|
||||
, CONVERT(FLOAT, dovs.available_bytes / 1048576.0) / CONVERT(FLOAT, dovs.total_bytes / 1024.0 / 1024.0) * 100 AS PctFreeExact
|
||||
FROM sys.master_files AS mf
|
||||
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) AS dovs) AS DE
|
||||
@@ -0,0 +1,13 @@
|
||||
SELECT
|
||||
serverproperty(N'ServerName') as [ServerName],
|
||||
serverproperty(N'InstanceName') as [InstanceName],
|
||||
DB.name,
|
||||
SUM(CASE WHEN type = 0 THEN MF.size * 8 / 1024 ELSE 0 END) AS DataFileSizeMB,
|
||||
SUM(CASE WHEN type = 1 THEN MF.size * 8 / 1024 ELSE 0 END) AS LogFileSizeMB
|
||||
FROM
|
||||
sys.master_files MF
|
||||
JOIN sys.databases DB ON DB.database_id = MF.database_id
|
||||
GROUP BY DB.name
|
||||
ORDER BY DataFileSizeMB DESC
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user