Monday, 23 February 2026

SQLDBA- Get logging activity into sql server

To know who is connected to the SQL server . we need to schedule this  in  SQL agent to run  very  minimal time to capture all the login information. 

USE [DBA]

GO



SET ANSI_NULLS ON

GO


SET QUOTED_IDENTIFIER ON

GO


CREATE TABLE [dbo].[chi_logon](

[LoginName] [nvarchar](100) NOT NULL,

[ClientHost] [nvarchar](100) NOT NULL,

[LoginType] [nvarchar](100) NULL,

[LastPostTime] [datetime] NOT NULL,

[ServerName] [nvarchar](100) NOT NULL,

 CONSTRAINT [pk_chi_logon] PRIMARY KEY CLUSTERED 

(

[LoginName] ASC,

[ClientHost] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO



USE [DBA]

GO


SET ANSI_NULLS ON

GO


SET QUOTED_IDENTIFIER ON

GO


CREATE TABLE [dbo].[chi_logon_log](

[PostTime] [datetime] NULL,

[ServerName] [nvarchar](100) NULL,

[LoginName] [nvarchar](100) NULL,

[LoginType] [nvarchar](100) NULL,

[ClientHost] [nvarchar](100) NULL

) ON [PRIMARY]

GO





USE [msdb]

GO



BEGIN TRANSACTION

DECLARE @ReturnCode INT

SELECT @ReturnCode = 0


IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Administrative' AND category_class=1)

BEGIN

EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Administrative'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback


END


DECLARE @jobId BINARY(16)

EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'ADM - Get Logon Activity', 

@enabled=1, 

@notify_level_eventlog=0, 

@notify_level_email=2, 

@notify_level_netsend=0, 

@notify_level_page=0, 

@delete_level=0, 

@description=N'No description available.', 

@category_name=N'Administrative', 

@owner_login_name=N'sa', 

@notify_email_operator_name=N'DBA ALERT', @job_id = @jobId OUTPUT

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

/****** Object:  Step [Update known connections]    Script Date: 2/23/2026 9:25:36 PM ******/

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Update known connections', 

@step_id=1, 

@cmdexec_success_code=0, 

@on_success_action=3, 

@on_success_step_id=0, 

@on_fail_action=2, 

@on_fail_step_id=0, 

@retry_attempts=0, 

@retry_interval=0, 

@os_run_priority=0, @subsystem=N'TSQL', 

@command=N'--Update REcords

WITH logon_CTE (logon, client_address, auth_scheme)

AS

(

SELECT DISTINCT s.[loginame] AS [loginame],

e.[client_net_address] AS [client_address],

e.[auth_scheme]

from sys.dm_exec_connections as e with (NOLOCK)

left outer join sys.sysprocesses as s with (NOLOCK)

on s.[spid] = e.session_id

WHERE s.loginame IS NOT NULL

)

UPDATE l

SET        [LoginType] = c.[auth_scheme]

           ,[LastPostTime] = GETDATE()

FROM dba.dbo.[chi_logon] as l

INNER JOIN logon_CTE as c

  ON c.logon = l.LoginName

  AND c.client_address = l.ClientHost

', 

@database_name=N'master', 

@flags=0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

/****** Object:  Step [Insert new connections]    Script Date: 2/23/2026 9:25:36 PM ******/

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Insert new connections', 

@step_id=2, 

@cmdexec_success_code=0, 

@on_success_action=1, 

@on_success_step_id=0, 

@on_fail_action=2, 

@on_fail_step_id=0, 

@retry_attempts=0, 

@retry_interval=0, 

@os_run_priority=0, @subsystem=N'TSQL', 

@command=N'--Insert new records

INSERT INTO dba.dbo.[chi_logon]

           ([LoginName]

           ,[ClientHost]

           ,[LoginType]

           ,[LastPostTime]

           ,[ServerName])

SELECT DISTINCT s.[loginame] AS [loginame],

e.[client_net_address] AS [client_address],

e.[auth_scheme],

GETDATE(),

@@SERVERNAME

from sys.dm_exec_connections as e with (NOLOCK)

left outer join sys.sysprocesses as s with (NOLOCK)

on s.[spid] = e.session_id

WHERE s.loginame IS NOT NULL

AND NOT EXISTS (SELECT 1

FROM dba.dbo.chi_logon as c

WHERE c.LoginName = s.loginame

AND c.ClientHost = e.client_net_address)

ORDER BY [loginame]

', 

@database_name=N'master', 

@flags=0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'1', 

@enabled=1, 

@freq_type=4, 

@freq_interval=1, 

@freq_subday_type=4, 

@freq_subday_interval=5, 

@freq_relative_interval=0, 

@freq_recurrence_factor=0, 

@active_start_date=20130607, 

@active_end_date=99991231, 

@active_start_time=300, 

@active_end_time=235959, 

@schedule_uid=NULL;

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

COMMIT TRANSACTION

GOTO EndSave

QuitWithRollback:

    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION

EndSave:

GO



Friday, 20 February 2026

SQLDBA - finding out dated statics

 -- Script - Find Details for Statistics of Whole Database

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;



--Script 2: Update Statistics for Database


--EXEC sp_updatestats;

--GO

Thursday, 19 February 2026

SQLDBA - High tempdb Usage: Queries Exceeding 100 MB in the Past 24 Hours

 USE [msdb]

GO


/****** Object:  Job [BTCH - High TEMPDB Usage Details]    Script Date: 2/20/2026 2:42:10 AM ******/

BEGIN TRANSACTION

DECLARE @ReturnCode INT

SELECT @ReturnCode = 0

/****** Object:  JobCategory [[Batch - H]]    Script Date: 2/20/2026 2:42:10 AM ******/

IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Batch - H]' AND category_class=1)

BEGIN

EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Batch - H]'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback


END


DECLARE @jobId BINARY(16)

EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'BTCH - High TEMPDB Usage Details', 

@enabled=1, 

@notify_level_eventlog=0, 

@notify_level_email=0, 

@notify_level_netsend=0, 

@notify_level_page=0, 

@delete_level=0, 

@description=N'High TEMPDB Usage Details', 

@category_name=N'[Batch - H]', 

@owner_login_name=N'sa', @job_id = @jobId OUTPUT

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

/****** Object:  Step [report]    Script Date: 2/20/2026 2:42:11 AM ******/

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'report', 

@step_id=1, 

@cmdexec_success_code=0, 

@on_success_action=1, 

@on_success_step_id=0, 

@on_fail_action=2, 

@on_fail_step_id=0, 

@retry_attempts=0, 

@retry_interval=0, 

@os_run_priority=0, @subsystem=N'TSQL', 

@command=N'use staging

go


DECLARE @xml1 NVARCHAR(MAX)

DECLARE @body NVARCHAR(MAX)

DECLARE @today DATE = GETDATE()

DECLARE @recipient_list VARCHAR(MAX)

--CREATE TABLE #tmp1 (

--[id] INT IDENTITY(1,1) PRIMARY KEY,

--event_info NVARCHAR(MAX),

--program_name NVARCHAR(256),

--command NVARCHAR(128),

--start_time DATETIME,

--total_used_mb DECIMAL(10,2),

--login_name NVARCHAR(128),

--transaction_isolation_level NVARCHAR(50),

--dbname NVARCHAR(128)

--);



SET NOCOUNT ON

SET @recipient_list = ''ksubbareddy.sap@gmail.com''

;WITH temp1

AS

(

SELECT

EventInfo,ProgramName,start_time,login_name,transaction_isolation_level,[database_name],[TotalUsedMB]

FROM

(

SELECT

SUBSTRING(event_info,1,100) AS EventInfo,

Program_Name AS ProgramName,

--Command,

start_time,

--run_date,

--TotalUsedMB,

login_name,

transaction_isolation_level,

[database_name],

[TotalUsedMB],

ROW_NUMBER() OVER (PARTITION BY SUBSTRING(event_info,1,100) ORDER BY [TotalUsedMB] DESC) AS seq_num

FROM staging.dbo.tempdb_session_usage_detail a

WHERE a.run_date >= GETDATE() -1

AND command NOT LIKE ''%sp_MSforeachdb%''

AND command NOT LIKE ''%BACKUP DATABASE%''

AND command NOT LIKE ''%UPDATE STATISTICS%''

AND command NOT LIKE ''%sp_server_diagnostics%''

AND command NOT LIKE ''%xp_cmdshell%''

AND program_name NOT LIKE ''SQLAgent - TSQL JobStep%''

)a

WHERE a.seq_num = 1

)


SELECT @xml1 = 

''<html><body><H4>High tempdb Usage: Queries Exceeding 100 MB in the Past 24 Hours.</H4>

<table border = 1> 

<tr>

<th> EventInfo </th> <th> ProgramName </th> <th> StartTime </th> <th> LoginName </th> <th> DBName </th><th> MaxTempDBUsageMB </th> 

</tr>'' +

CAST((SELECT a.EventInfo AS ''td'', 

'''',

a.ProgramName AS ''td'',

'''',

REPLACE(CONVERT(VARCHAR(23), start_time, 126), ''T'', '' '') AS ''td'',

'''',

a.login_name AS ''td'',

'''',

ISNULL(CAST(a.[database_name] AS VARCHAR(10)),'''') AS ''td'',

'''',

a.[TotalUsedMB] AS ''td''


FROM temp1 a

ORDER BY a.[TotalUsedMB] DESC, a.EventInfo ASC

FOR XML PATH(''tr''), ELEMENTS) AS NVARCHAR(MAX)) +

N''</table>'';


SET @body = @xml1 + ''</body></html>''


EXEC msdb.dbo.sp_send_dbmail

@subject = ''High TEMPDB Usage Details in the Past 24 Hours'',

@body = @body,

@body_format =''HTML'',

@recipients = @recipient_list;



--DROP TABLE #tmp1

', 

@database_name=N'master', 

@flags=0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'report', 

@enabled=1, 

@freq_type=4, 

@freq_interval=1, 

@freq_subday_type=1, 

@freq_subday_interval=0, 

@freq_relative_interval=0, 

@freq_recurrence_factor=0, 

@active_start_date=20250908, 

@active_end_date=99991231, 

@active_start_time=500, 

@active_end_time=235959, 

@schedule_uid=NULL;

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

COMMIT TRANSACTION

GOTO EndSave

QuitWithRollback:

    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION

EndSave:

GO





USE [msdb]

GO


/****** Object:  Job [BTCH - High TEMPDB Usage Details - DBA]    Script Date: 2/20/2026 2:42:42 AM ******/

BEGIN TRANSACTION

DECLARE @ReturnCode INT

SELECT @ReturnCode = 0

/****** Object:  JobCategory [[Batch - H]]    Script Date: 2/20/2026 2:42:42 AM ******/

IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Batch - H]' AND category_class=1)

BEGIN

EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Batch - H]'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback


END


DECLARE @jobId BINARY(16)

EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'BTCH - High TEMPDB Usage Details - DBA', 

@enabled=1, 

@notify_level_eventlog=0, 

@notify_level_email=0, 

@notify_level_netsend=0, 

@notify_level_page=0, 

@delete_level=0, 

@description=N'High TEMPDB Usage Details', 

@category_name=N'[Batch - H]', 

@owner_login_name=N'sa', @job_id = @jobId OUTPUT

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

/****** Object:  Step [report]    Script Date: 2/20/2026 2:42:42 AM ******/

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'report', 

@step_id=1, 

@cmdexec_success_code=0, 

@on_success_action=1, 

@on_success_step_id=0, 

@on_fail_action=2, 

@on_fail_step_id=0, 

@retry_attempts=0, 

@retry_interval=0, 

@os_run_priority=0, @subsystem=N'TSQL', 

@command=N'use staging

go


DECLARE @xml1 NVARCHAR(MAX)

DECLARE @body NVARCHAR(MAX)

DECLARE @today DATE = GETDATE()

DECLARE @recipient_list VARCHAR(MAX)

--CREATE TABLE #tmp1 (

--[id] INT IDENTITY(1,1) PRIMARY KEY,

--event_info NVARCHAR(MAX),

--program_name NVARCHAR(256),

--command NVARCHAR(128),

--start_time DATETIME,

--total_used_mb DECIMAL(10,2),

--login_name NVARCHAR(128),

--transaction_isolation_level NVARCHAR(50),

--dbname NVARCHAR(128)

--);



SET NOCOUNT ON

SET @recipient_list = ''ksubbareddy.sap@gmail.com''

;WITH temp1

AS

(

SELECT

SUBSTRING(event_info,1,100) AS EventInfo,

Program_Name AS ProgramName,

--Command,

start_time,

--run_date,

--TotalUsedMB,

(SELECT TOP 1 [TotalUsedMB]

FROM staging.dbo.tempdb_session_usage_detail b

WHERE SUBSTRING(b.event_info,1,100) = SUBSTRING(a.event_info,1,100)

AND B.Program_Name=A.Program_Name

--and b.command=a.command

and b.start_time=a.start_time

AND b.run_date >= GETDATE() -1

ORDER BY [TotalUsedMB] DESC) AS [TotalUsedMB],


login_name,

transaction_isolation_level,

[dop],

[parallel_worker_count]

--database_name as DBName

FROM staging.dbo.tempdb_session_usage_detail a

WHERE a.run_date >= GETDATE() -1

AND command NOT LIKE ''%sp_MSforeachdb%''

AND command NOT LIKE ''%BACKUP DATABASE%''

AND command NOT LIKE ''%UPDATE STATISTICS%''

AND command NOT LIKE ''%sp_server_diagnostics%''

AND command NOT LIKE ''%xp_cmdshell%''

AND program_name NOT LIKE ''SQLAgent - TSQL JobStep%''

GROUP BY 

SUBSTRING(event_info,1,100),

Program_Name,

--Command,

start_time,

--run_date,

--TotalUsedMB,

login_name,

transaction_isolation_level,

[dop],

[parallel_worker_count]

--database_name

)


SELECT @xml1 = 

''<html><body><H4>High tempdb Usage: Queries Exceeding 100 MB in the Past 24 Hours.</H4>

<table border = 1> 

<tr>

<th> EventInfo </th> <th> ProgramName </th> <th> StartTime </th> <th> TempDBUsageMB </th> <th> LoginName </th> <th> DOP </th> <th> ParallelWorkerCount </th> 

</tr>'' +

CAST((SELECT a.EventInfo AS ''td'', 

'''',

a.ProgramName AS ''td'',

'''',

REPLACE(CONVERT(VARCHAR(23), start_time, 126), ''T'', '' '') AS ''td'',

'''',

a.[TotalUsedMB] AS ''td'',

'''',

a.login_name AS ''td'',

'''',

ISNULL(CAST(a.[dop] AS VARCHAR(10)),'''') AS ''td'',

'''',

ISNULL(CAST(a.[parallel_worker_count] AS VARCHAR(10)),'''') AS ''td''


FROM temp1 a

ORDER BY a.[TotalUsedMB] DESC, a.EventInfo ASC

FOR XML PATH(''tr''), ELEMENTS) AS NVARCHAR(MAX)) +

N''</table>'';


SET @body = @xml1 + ''</body></html>''


EXEC msdb.dbo.sp_send_dbmail

@subject = ''High TEMPDB Usage Details in the Past 24 Hours'',

@body = @body,

@body_format =''HTML'',

@recipients = @recipient_list;



--DROP TABLE #tmp1

', 

@database_name=N'master', 

@flags=0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'report', 

@enabled=1, 

@freq_type=4, 

@freq_interval=1, 

@freq_subday_type=1, 

@freq_subday_interval=0, 

@freq_relative_interval=0, 

@freq_recurrence_factor=0, 

@active_start_date=20250908, 

@active_end_date=99991231, 

@active_start_time=1000, 

@active_end_time=235959, 

@schedule_uid=NULL;

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

COMMIT TRANSACTION

GOTO EndSave

QuitWithRollback:

    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION

EndSave:

GO



SQLDBA_ Shrink tempDB


  

create proc dbo.sp_chi_shrinkdata  

(  

 @dbname  sysname = null,  

 @freed_space  int = null, --  the portion of free space (MB) to reclaim, eg. 90% of 1 gb is 900 mb  

 @stats   int = null --  Display status message every @stats MB.  

)  

as  

  

/*  Author: 

**  Created on:

**  Modified on: 

**  Purpose: Shrinks data file (not log).  

**  Features:  

**    1. Can shrink data size down to a specified value (optional). If desired size not provided, it   

**       will shrink all the way down until there's 200 MB free space left;  

**    2. Can report time, data size and cycle number after each run. If echo interval not supplied,   

**       it will report at every 20 MB interval.  

**  3. No need to be in the current database to shrink. It is in master :-)  

**  Test code:  

**    sp_chi_shrinkdata choice, 200, null  

**    (in waste_mgmt)hi  

*/  

begin  

   

 set nocount on  

  

 declare @start_data_total int,   

  @end_data_total int,   

  @message varchar(150),   

  @count int,   

  @start_data_used int,   

  @cmd varchar(500),   

  @string sysname,   

  @start_data_free int  

  

 if object_id ('tempdb..##datafilesize') is not null  

   drop table ##datafilesize  

  

 create table ##datafilesize   

 (   

  Fileid   tinyint,   

  [FileGroup]  tinyint,   

  TotalExtents  dec (8, 1),   

  UsedExtents  dec (8, 1),   

  [Name]   varchar(50),   

  [FileName]  sysname   

 )  

   

 if @dbname is null  

   set @dbname = db_name()  

  

 set @string = 'use ' + @dbname + ' DBCC SHOWFILESTATS with no_infomsgs'  

  

 insert into ##datafilesize exec (@string)  

  

 set @count = 1  

 --set @datafile = (select rtrim(name) from sysfiles (nolock) where fileid = 1)   

 set @start_data_total = (select TotalExtents * 8 * 8192.0 / 1048576.0 from ##datafilesize )  

     --  Trims away trailing blanks or will NOT work!!  

 --set @start_data_total = @datafile  

 set @start_data_used = (select UsedExtents * 8 * 8192.0 / 1048576.0 from ##datafilesize )  

   

 if @stats is null   

   set @stats = 20 -- default to 20 mb at each interval  

 if @freed_space is null  

   set @freed_space = @start_data_total - @start_data_used - 200   

       --  default to 200 MB free space left after shrinking  

 set @end_data_total = @start_data_total - @freed_space   

   

 print''  

 set @start_data_free = (@start_data_total-@start_data_used)  

 print '*** Before shrinking ***' + char(10) +   

       'Data total:   ' + convert(char(5),@start_data_total) + ' MB' + char(10) +  

       'Data used:    ' + convert(char(5),@start_data_used) + ' MB' + char(10) +   

       'Data free:    ' + convert(char(5),@start_data_free) + ' MB' + char(10)  

 print ''  

 print 'Starting shrinking data file for ' + @dbname + '......' + char(10)  

 while @start_data_total > @end_data_total  

   begin  

     set @start_data_total = @start_data_total - @stats  

 --    set @cmd = N' dbcc shrinkfile ('+@datafile+', '+convert(varchar(5), @start_data_total)+') WITH NO_INFOMSGS'  

   set @cmd = N' use ' + @dbname + ' dbcc shrinkfile (1, '+convert(varchar(5), @start_data_total)+') WITH NO_INFOMSGS'  

     exec (@cmd)  

     truncate table ##datafilesize  

     insert into ##datafilesize exec (@string)  

     set @start_data_total = (select TotalExtents * 8 * 8192.0 / 1048576.0 from ##datafilesize )  

 --    set @start_data_used = (select UsedExtents * 8 * 8192.0 / 1048576.0 from ##datafilesize )  

     set @message = convert(varchar(30), getdate(), 20) + '       - cycle ' + convert (varchar(6), @count) +   

       '        - Free space left: ' + convert(char(5),(@start_data_total - @start_data_used)) + ' MB'    

     print @message  

     set @count = @count + 1  

   end  

 print ''  

 print 'Shrinking data complete. Total reclaimed space: ' + cast((@start_data_free - (@start_data_total - @start_data_used)) as varchar(10)) + ' MB'   

       + char(10) + char(10) + '*** After shrinking ***' + char(10) +   

       'Data total:   ' + convert(char(5),@start_data_total) + ' MB' + char(10) +  

       'Data used:    ' + convert(char(5),@start_data_used) + ' MB' + char(10) +   

       'Data free:    ' + convert(char(5),(@start_data_total - @start_data_used)) + ' MB' + char(10)  

  

 drop table ##datafilesize  

  

 return (0)  -- sp_chi_shrinkdata  

end  



USE [msdb]

GO


/****** Object:  Job [ADM - Shrink TempDB]    Script Date: 2/20/2026 2:39:41 AM ******/

BEGIN TRANSACTION

DECLARE @ReturnCode INT

SELECT @ReturnCode = 0

/****** Object:  JobCategory [Database Maintenance]    Script Date: 2/20/2026 2:39:41 AM ******/

IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1)

BEGIN

EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback


END


DECLARE @jobId BINARY(16)

EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'ADM - Shrink TempDB', 

@enabled=1, 

@notify_level_eventlog=2, 

@notify_level_email=0, 

@notify_level_netsend=0, 

@notify_level_page=0, 

@delete_level=0, 

@description=N'Shrinks TempDB', 

@category_name=N'Database Maintenance', 

@owner_login_name=N'sa', @job_id = @jobId OUTPUT

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

/****** Object:  Step [shink]    Script Date: 2/20/2026 2:39:41 AM ******/

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'shink', 

@step_id=1, 

@cmdexec_success_code=0, 

@on_success_action=1, 

@on_success_step_id=0, 

@on_fail_action=2, 

@on_fail_step_id=0, 

@retry_attempts=0, 

@retry_interval=1, 

@os_run_priority=0, @subsystem=N'TSQL', 

@command=N'sp_chi_shrinkdata tempdb, 2000, 1000', 

@database_name=N'master', 

@flags=0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

COMMIT TRANSACTION

GOTO EndSave

QuitWithRollback:

    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION

EndSave:

GO



SQLDBA- Large Temp Trans Notification

USE [msdb]

GO


/****** Object:  Job [ADM - Large Temp Trans Notification]    Script Date: 2/20/2026 2:35:31 AM ******/

BEGIN TRANSACTION

DECLARE @ReturnCode INT

SELECT @ReturnCode = 0

/****** Object:  JobCategory [Database Maintenance]    Script Date: 2/20/2026 2:35:31 AM ******/

IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1)

BEGIN

EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback


END


DECLARE @jobId BINARY(16)

EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'ADM - Large Temp Trans Notification', 

@enabled=1, 

@notify_level_eventlog=2, 

@notify_level_email=0, 

@notify_level_netsend=0, 

@notify_level_page=0, 

@delete_level=0, 

@description=N'No description available.', 

@category_name=N'Database Maintenance', 

@owner_login_name=N'sa', @job_id = @jobId OUTPUT

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

/****** Object:  Step [step_one]    Script Date: 2/20/2026 2:35:32 AM ******/

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'step_one', 

@step_id=1, 

@cmdexec_success_code=0, 

@on_success_action=1, 

@on_success_step_id=0, 

@on_fail_action=2, 

@on_fail_step_id=0, 

@retry_attempts=0, 

@retry_interval=1, 

@os_run_priority=0, @subsystem=N'TSQL', 

@command=N'EXEC msdb.dbo.sp_send_dbmail @recipients = ''ksubbareddy.sap@gmail.com'', 

   @query = ''use tempdb; DBCC OPENTRAN'',

   @subject = ''Large TempDB OpenTran Report'',

   @body = ''Open Transaction for TempDB as log size has increased over 3.75GB:''

', 

@database_name=N'master', 

@flags=0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

COMMIT TRANSACTION

GOTO EndSave

QuitWithRollback:

    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION

EndSave:

GO



SQLDBA - TempDB usage details

 TempDB usage details that you can use for monitoring or troubleshooting in SQL Server. I’ll include the most common DMV queries and what each one tells you.


🔍 TempDB Usage – Key Details & Diagnostic Queries

1. TempDB Space Usage (By File)

Shows how much space is used/free in each TempDB data file.

SQLSELECT    name AS FileName,    size/128 AS TotalMB,    CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128 AS UsedMB,    (size - FILEPROPERTY(name, 'SpaceUsed'))/128 AS FreeMBFROM tempdb.sys.database_files;Show more lines


2. TempDB Usage by Session

Helps identify which sessions are consuming TempDB.

SQLSELECT     session_id,    user_objects_alloc_page_count AS UserAllocatedPages,    internal_objects_alloc_page_count AS InternalAllocatedPages,    user_objects_dealloc_page_count AS UserDeallocatedPages,    internal_objects_dealloc_page_count AS InternalDeallocatedPagesFROM sys.dm_db_session_space_usageORDER BY (user_objects_alloc_page_count + internal_objects_alloc_page_count) DESC;Show more lines


3. TempDB Usage by Running Requests

Shows TempDB grants/consumption per active request.

SQLSELECT     r.session_id,    r.status,    t.text AS SQLText,    r.tempdb_space_used,    r.tempdb_space_allocatedFROM sys.dm_exec_requests rCROSS APPLY sys.dm_exec_sql_text(r.sql_handle) tORDER BY r.tempdb_space_used DESC;Show more lines

(Available in SQL Server 2019+)


4. Version Store Usage (Common cause of TempDB growth)

Tracks TempDB version store size used for RCSI/Snapshot.

SQLSELECT     SUM(version_store_reserved_page_count) * 8 / 1024 AS VersionStoreMBFROM sys.dm_db_file_space_usage;Show more lines


5. TempDB File I/O Stats

Useful to see if TempDB is experiencing heavy writes.

SQLSELECT     file_id,    num_of_reads,    num_of_writes,    io_stall,    io_stall_read_ms,    io_stall_write_msFROM sys.dm_io_virtual_file_stats(2, NULL);Show more lines


🧠 What Typically Consumes TempDB?


Sorting (ORDER BY, GROUP BY)

Hash operations & Hash joins

Temp tables, table variables

Row versioning (RCSI / Snapshot Isolation)

Online index rebuilds

Worktables for large queries

Triggers

Cursors

USE [staging]

GO


/****** Object:  Table [dbo].[tempdb_session_usage_detail]    Script Date: 2/20/2026 2:32:04 AM ******/

SET ANSI_NULLS ON

GO


SET QUOTED_IDENTIFIER ON

GO

Use Staging 

GO

CREATE TABLE [dbo].[tempdb_session_usage_detail](

[tempdb_session_usage_detail_id] [int] IDENTITY(1,1) NOT NULL,

[session_id] [int] NULL,

[InternalPages] [bigint] NULL,

[UserPages] [bigint] NULL,

[TotalUsedMB] [decimal](10, 2) NULL,

[start_time] [datetime] NULL,

[host_name] [nvarchar](128) NULL,

[login_name] [nvarchar](128) NULL,

[command] [nvarchar](128) NULL,

[event_info] [nvarchar](max) NULL,

[status] [nvarchar](128) NULL,

[program_name] [nvarchar](256) NULL,

[transaction_isolation_level] [nvarchar](50) NULL,

[database_name] [nvarchar](128) NULL,

[dop] [int] NULL,

[parallel_worker_count] [int] NULL,

[sql_text] [nvarchar](max) NULL,

[query_plan] [xml] NULL,

[run_date] [datetime] NULL,

PRIMARY KEY CLUSTERED 

(

[tempdb_session_usage_detail_id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO






USE [msdb]

GO


/****** Object:  Job [ADM - High Tempdb Usage Queries]    Script Date: 2/20/2026 2:27:39 AM ******/

BEGIN TRANSACTION

DECLARE @ReturnCode INT

SELECT @ReturnCode = 0

/****** Object:  JobCategory [[Batch - H]]    Script Date: 2/20/2026 2:27:40 AM ******/

IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Batch - H]' AND category_class=1)

BEGIN

EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Batch - H]'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback


END


DECLARE @jobId BINARY(16)

EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'ADM - High Tempdb Usage Queries', 

@enabled=1, 

@notify_level_eventlog=0, 

@notify_level_email=2, 

@notify_level_netsend=0, 

@notify_level_page=0, 

@delete_level=0, 

@description=N'To Capture High Tempdb ussage Queires', 

@category_name=N'[Batch - H]', 

@owner_login_name=N'sa', 

@notify_email_operator_name=N'DBA ALERT', @job_id = @jobId OUTPUT

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

/****** Object:  Step [High Tempdb Use queries]    Script Date: 2/20/2026 2:27:40 AM ******/

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'High Tempdb Use queries', 

@step_id=1, 

@cmdexec_success_code=0, 

@on_success_action=1, 

@on_success_step_id=0, 

@on_fail_action=2, 

@on_fail_step_id=0, 

@retry_attempts=0, 

@retry_interval=0, 

@os_run_priority=0, @subsystem=N'TSQL', 

@command=N'

use tempdb


go




INSERT INTO staging.dbo.tempdb_session_usage_detail (

    session_id,

    InternalPages,

    UserPages,

    TotalUsedMB,

    start_time,

    host_name,

    login_name,

    command,

    event_info,

    status,

    program_name,

    transaction_isolation_level,

    database_name,

    dop,

    parallel_worker_count,

    sql_text,

    query_plan,

run_date

)



SELECT U.session_id, U.InternalPages, U.UserPages, U.[TotalUsedMB], r.start_time, s.host_name,

s.login_name,r.command,i.event_info,r.status,s.program_name

,CASE s.transaction_isolation_level 

    WHEN 0 THEN ''Unspecified'' 

    WHEN 1 THEN ''ReadUncommitted'' 

    WHEN 2 THEN ''ReadCommitted'' 

    WHEN 3 THEN ''Repeatable'' 

    WHEN 4 THEN ''Serializable'' 

    WHEN 5 THEN ''Snapshot'' END AS transaction_isolation_level, DB_NAME(r.database_id) AS database_name,

r.dop, r.parallel_worker_count,

st.text,

    eqp.query_plan AS [Query Plan],getdate() as run_DATE

FROM

(

SELECT 

tsu.session_id,

SUM(internal_objects_alloc_page_count) AS [InternalPages],

SUM(user_objects_alloc_page_count) AS [UserPages],

SUM((internal_objects_alloc_page_count + user_objects_alloc_page_count) * 8 / 1024 ) AS [TotalUsedMB]

FROM sys.dm_db_task_space_usage AS tsu

WHERE tsu.session_id <> @@SPID -- Exclude your own session

GROUP BY

tsu.session_id

HAVING 

SUM ( (internal_objects_alloc_page_count + user_objects_alloc_page_count) * 8 / 1024 ) >  100

)U

JOIN sys.dm_exec_requests as r

on r.session_id = U.session_id

JOIN sys.dm_exec_sessions as s

on s.session_id = r.session_id

CROSS APPLY sys.dm_exec_input_buffer(s.session_id, r.request_id) as i

--OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) as st

OUTER APPLY ::fn_get_sql (r.sql_handle) As st

OUTER APPLY sys.dm_exec_query_plan(r.plan_handle) AS eqp', 

@database_name=N'tempdb', 

@flags=0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'run every 5 min', 

@enabled=1, 

@freq_type=8, 

@freq_interval=127, 

@freq_subday_type=4, 

@freq_subday_interval=5, 

@freq_relative_interval=0, 

@freq_recurrence_factor=1, 

@active_start_date=20250905, 

@active_end_date=99991231, 

@active_start_time=0, 

@active_end_time=235959, 

@schedule_uid=NULL;

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

COMMIT TRANSACTION

GOTO EndSave

QuitWithRollback:

    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION

EndSave:

GO



SQLDBA- SQL Server Management Studio 22 Download, Install and Configure

  SQL Server Management Studio 22 Download, Install and Configure   This article describes how to install SQL Server Management Studio (...