Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

INF : Contrôle des performances et de l'activité de SQL Server 2000

Ancien nº de publication de cet article : F283696
Résumé
Cet article décrit le travail ActivityTrace ; celui-ci place les données de blocage et de performances dans un fichier de trace pour vous permettre de les analyser ultérieurement. Copiez le script du travail ActivityTrace de cet article dans une fenêtre de l'Analyseur de requête et exécutez-le pour créer le travail. Tel qu'il est présenté, ce travail est activé et programmé pour être exécuté toutes les minutes.

Lorsque le travail est exécuté pour la première fois, il crée un fichier nommé C:\ActivityTrace.ini qui contrôle le travail ActivityTrace. Ce fichier ne peut pas être modifié à l'aide du Bloc-notes.

Pour démarrer la trace, modifiez le fichier ActivityTrace.ini en changeant l'une des variables suivantes, ou les deux, comme suit :
@blockingcheck = yes@performancecheck = yes
Une fois la modification apportée, la prochaine exécution du travail entraînera le démarrage de la trace.

Pour arrêter la trace, modifiez le fichier ActivityTrace.ini en changeant les deux variables suivantes comme suit :
@blockingcheck = no@performancecheck = no
La prochaine exécution du travail entraînera l'arrêt de la trace.

Les résultats de la trace sont consignés dans le fichier C:\ActivityTrace.trc. Lors du démarrage de la trace, le fichier C:\ActivityTrace.trc d'origine est écrasé ; prenez donc soin de copier le fichier C:\ActivityTrace.trc dans un autre endroit avant de redémarrer la trace.

Utilisez le Générateur de profils SQL Server pour afficher les données du fichier de trace afin de trouver un blocage ou une barrière aux performance.

Pour plus d'informations sur l'analyse des données recueillies par la trace, cliquez sur les numéros suivants pour afficher les articles correspondants dans la Base de connaissances Microsoft :
283784 INF : Procédure d'affichage des données d'activité de SQL Server 2000
283725 INF : Procédure d'affichage des données de blocage de SQL Server 2000
283886 INF : Procédure d'affichage des données de performances de SQL Server 2000
Pour plus d'informations sur le contrôle d'une trace, reportez-vous à l'article suivant :
283786 INF : Procédure de contrôle des traces SQL Server 2000
REMARQUE : Assurez-vous d'arrêter la trace en réglant les paramètres @blockingcheck et @performancecheck sur « no » dans le fichier ActivityTrace.ini. Si vous arrêtez la trace par l'intermédiaire de la procédure stockée trace décrite dans l'article référencé précédemment (Q283786), la trace s'arrêtera mais l'exécution du travail se poursuivra. Lors de sa prochaine exécution, le travail lira qu'au moins un des paramètres du fichier ActivityTrace.ini est encore réglé sur « yes » et il redémarrera la trace, écrasant le fichier ActivityTrace.trc d'origine.
Plus d'informations
Le travail ActivityTrace est contrôlé par l'intermédiaire du fichier C:\ActivityTrace.ini qui contient les variables suivantes :
  • @performancecheck
    Si la variable @performance est « yes », l'événement utilisateur 83 est utilisé pour écrire la table sysperfinfo dans le fichier de trace. Si la variable @performance est « no », l'événement utilisateur 83 n'est pas généré.
  • @blockingcheck
    Si la variable @blockingcheck est « yes », l'événement utilisateur 82 est utilisé pour enregistrer « no block » (pas de blocage) ou « blocking » (blocage). En cas de blocage, l'événement utilisateur 82 est utilisé pour enregistrer les tables sysprocesses et syslockinfo dans le fichier de trace. L'événement utilisateur 82 est également utilisé pour placer des informations PSS DBCC dans le fichier de trace en cas de blocage. Si la variable @blockingcheck est « no », cette étape est ignorée et l'événement utilisateur 82 n'est pas généré.
  • @tracefile
    Les données sont écrites dans le fichier de trace spécifié dans cette variable @tracefile. Modifiez la variable @tracefile pour enregistrer la trace sur un lecteur différent et sous un autre nom de fichier. Notez que la trace ajoute automatiquement l'extension .trc.
  • @maxfilesize
    Lorsque le fichier de trace atteint le nombre de mégaoctets spécifié dans la variable @maxfilesize, le fichier est fermé. Modifiez la variable @maxfilesize pour augmenter ou réduire la taille (en mégaoctets) du fichier de trace.
  • @minMBfree
    Lorsque l'espace disque en mégaoctets sur le lecteur spécifié dans la variable @tracefile est inférieur à l'espace spécifié dans la variable @minMBfree, la trace est arrêtée.
  • @stoptime
    Modifiez la variable @stoptime pour régler l'heure d'arrêt automatique de la trace.
  • @options
    Lorsque l'argument @options est réglé sur 2, la trace crée de nouveaux fichiers de trace en cas de dépassement de la variable @maxfilesize. Lorsque le fichier de trace atteint le nombre de mégaoctets spécifié dans la variable @maxfilesize, ce fichier est fermé et un nouveau fichier est créé. Si le fichier de trace d'origine spécifié dans la variable @tracefile est C:\ActivityTrace, le fichier d'origine est C:\ActivityTrace.trc. Le fichier de trace suivant est C:\ActivityTrace_1.trc, le suivant C:\ActivityTrace_2.trc et ainsi de suite.
  • @events
    Modifiez la variable @events pour contrôler les événements tracés.
  • @columns
    Modifiez la variable @columns pour contrôler les colonnes tracées.
  • @filter1
    Le nombre de variables @filter peut être compris entre 0 et 99 (@filter99). Les variables de filtre doivent commencer par @filter1 et continuer en séquence jusqu'au dernier filtre. Les quatre arguments de la variable @filter sont : column_id, logical_operator, comparison_operator et value. Ces arguments sont utilisés par la procédure stockée du système, sp_trace_setfilter, pour créer un filtre.
  • @job_name
    Modifiez la variable @job_name pour changer le nom du travail de trace (le nom d'origine étant ActivityTrace). Notez que, si vous renommez le travail ActivityTrace, vous devez également en modifier le nom dans les propriétés du travail ActivityTrace.
  • @schedule00seconds
    Lorsque cette variable est réglée sur « yes », le travail ActivityTrace est programmé pour être exécuté toutes les minutes, au passage exact de la minute, conformément à la programmation nommée schedule00seconds.
  • @schedule15seconds
    Lorsque cette variable est réglée sur « yes », le travail ActivityTrace est programmé pour être exécuté toutes les minutes, 15 secondes après la minute, conformément à la programmation nommée schedule15seconds.
  • @schedule30seconds
    Lorsque cette variable est réglée sur « yes », le travail ActivityTrace est programmé pour être exécuté toutes les minutes, 30 secondes après la minute, conformément à la programmation nommée schedule30seconds.
  • @schedule45seconds
    Lorsque cette variable est réglée sur « yes », le travail ActivityTrace est programmé pour être exécuté toutes les minutes, 45 secondes après la minute, conformément à la programmation nommée schedule45seconds.
Notez que si les variables @schedule00seconds, @schedule15seconds, @schedule30seconds et @schedule45seconds sont toutes réglées sur « yes », le travail est exécuté toutes les 15 secondes. Si les variables @schedule00seconds, @schedule15seconds, @schedule30seconds et @schedule45seconds sont toutes réglées sur « no », le travail n'est pas exécuté. Le travail n'étant pas exécuté dans ce cas, il ne peut pas détecter de changement dans le fichier ActivityTrace.ini ; par conséquent, le travail doit être démarré manuellement pour qu'il puisse lire le fichier ActivityTrace.ini et détecter les changements de programmation.

Pour plus d'informations sur les arguments @tracefile, @maxfilesize, @stoptime et @options, consultez l'article sp_trace_create de la Documentation en ligne de SQL Server 2000.

Pour plus d'informations sur les arguments @events et @columns, consultez l'article sp_trace_setevent de la Documentation en ligne de SQL Server 2000.

Pour plus d'informations sur les filtres, consultez l'article sp_trace_setfilter de la Documentation en ligne de SQL Server 2000.

Examinons par exemple le contenu suivant d'un fichier @traceini nommé C:\ActivityTrace.ini :
@performancecheck  = no @blockingcheck     = no @tracefile         = C:\ActivityTrace @maxfilesize       = 50@minMBfree         = 200 @stoptime          = 2010-12-31 12:00:00.000 @options           = 2 @events            = 10,11,12,13,16,17,19,33,42,43,55,82,83 @columns           = 1,2,3,6,9,10,11,12,13,14,15,16,17,18,25 @filter1           = 10, 0, 7, N'SQL Profiler' @filter2           = 10, 0, 7, N'SQLAgent - Job Manager' @filter3           = 10, 0, 7, N'SQLAgent - Alert Engine' @filter4           = 10, 0, 7, N'SQLAgent - Generic Refresher' @filter5           = 3, 0, 1, 4 @job_name          = ActivityTrace @schedule00seconds = yes @schedule15seconds = no @schedule30seconds = no @schedule45seconds = no
En réglant les variables de cette manière dans le fichier ActivityTrace.ini, le travail ActivityTrace (@jobname) est exécuté toutes les minutes, au passage exact de la minute (@schedule00seconds = yes). Ce travail est configuré pour créer un fichier de trace, C:\ActivityTrace.trc (@tracefile), contenant l'activité de la trace du blocage et des performances ; cependant, la trace n'est pas démarrée (@performancecheck = no, @blockingcheck = no).

Si la trace est démarrée, lorsque le fichier de trace atteint 50 Mo (@maxfilesize), C:\ActivityTrace.trc est fermé et un nouveau fichier, C:\ActivityTrace_1.trc, est créé (@options). Les événements suivants seront tracés (@events) :
  • RPC:Completed
  • RPC:Starting
  • SQL:BatchCompleted
  • SQL:BatchStarting
  • Attention
  • ExistingConnection
  • DTCTransaction
  • Exception
  • SP:Starting
  • SP:Completed
  • HashWarning
  • User-defined event 82
  • User-defined event 83
Les colonnes suivantes seront tracées (@columns) :
  • TextData
  • BinaryData
  • DatabaseID
  • NTUserName
  • ClientProcessID
  • ApplicationName
  • SQLSecurityLoginName
  • SPID
  • Duration
  • StartTime
  • EndTime
  • Reads
  • Writes
  • CPU
  • IntegerData
La trace procèdera au filtrage des événements pour ne capturer que ceux où ApplicationName NOT LIKE 'SQL Profiler' (@filter1), ApplicationName NOT LIKE 'SQLAgent - Job Manager' (@filter2), ApplicationName NOT LIKE 'SQLAgent - Alert Engine' (@filter3), ApplicationName NOT LIKE 'SQLAgent - Generic Refresher' (@filter4) et DatabaseID NOT EQUAL 4 (@filter5).

La trace se terminera à 12:00 le 31 décembre 2010 (@stoptime).

Script du travail ActivityTrace

-- Script generated on 2/9/2001 12:02 PMBEGIN TRANSACTION              DECLARE @JobID BINARY(16)    DECLARE @ReturnCode INT      SELECT @ReturnCode = 0     IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < 1   EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]'IF (SELECT COUNT(*) FROM msdb.dbo.sysjobs WHERE name = N'ActivityTrace') > 0   PRINT N'The job "ActivityTrace" already exists so will not be replaced.'ELSEBEGIN   -- Add the job.  EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name = N'ActivityTrace', @owner_login_name = N'sa', @description = N'Trace performance and blocking.', @category_name = N'[Uncategorized (Local)]', @enabled = 1, @notify_level_email = 0, @notify_level_page = 0, @notify_level_netsend = 0, @notify_level_eventlog = 2, @delete_level= 0  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   -- Add the job steps.  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 1, @step_name = N'CreateIniFile', @command = N'-- create C:\ActivityTrace.ini filedeclare @c nvarchar(256), @rc int, @i char(20)set @i = ''C:\ActivityTrace.ini''set @c = ''copy C:\ActivityTrace.ini C:\ActivityTrace.bak'' exec @rc = master.dbo.xp_cmdshell @c, no_outputif (@rc = 0) goto finishset @c = ''echo @blockingcheck     = no > ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @performancecheck  = no >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @tracefile         = C:\ActivityTrace >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @maxfilesize       = 50 >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @minMBfree         = 200 >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @stoptime          = 2010-12-31 12:00:00.000 >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @options           = 2 >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @events            = 10,11,12,13,16,17,19,33,42,43,55,82,83 >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @columns           = 1,2,3,6,9,10,11,12,13,14,15,16,17,18,25 >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @filter1           = 10, 0, 7, N''''SQL Profiler'''' >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @filter2           = 10, 0, 7, N''''SQLAgent - Job Manager'''' >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @filter3           = 10, 0, 7, N''''SQLAgent - Alert Engine'''' >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @filter4           = 10, 0, 7, N''''SQLAgent - Generic Refresher'''' >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @filter5           = 3, 0, 1, 4 >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @job_name          = ActivityTrace >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @schedule00seconds = yes >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @schedule15seconds = no >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @schedule30seconds = no >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputset @c = ''echo @schedule45seconds = no >> ''+@iexec master.dbo.xp_cmdshell @c, no_outputfinish:if exists (select * from dbo.sysobjects where id = object_id(N''[_t1]'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)drop table [_t1]create table _t1 ([c1] nvarchar(512))exec (''bulk insert _t1 FROM ''''''+@i + '''''''')', @database_name = N'master', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 3, @on_fail_step_id = 0, @on_fail_action = 2  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 2, @step_name = N'CreateTrace', @command = N'-- create tracedeclare @p varchar(3), @b varchar(3), @traceid int, @options int, @tracefile nvarchar (245), @maxfilesize bigint, @stoptime datetime, @minMBfree bigint, @rc int, @on bit, @cmd1 nvarchar(128), @mbfree bigint, @job_name sysname, @s sysnameselect @p = cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as nvarchar (3)) from _t1 where left(c1,3) =  ''@pe''select @b = cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as nvarchar (3)) from _t1 where left(c1,3) = ''@bl''select @tracefile = cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as nvarchar (245)) from _t1 where left(c1,3) = ''@tr''select @maxfilesize = cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as bigint) from _t1 where left(c1,3) = ''@ma''select @minMBfree = cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as bigint) from _t1 where left(c1,3) = ''@mi''select @stoptime = cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as datetime) from _t1 where left(c1,3) = ''@st''select @options = cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as int) from _t1 where left(c1,3) = ''@op''select @job_name = cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as sysname) from _t1 where left(c1,3) = ''@jo''while (select count(*) from _t1 where left(c1,3) = ''@sc'') > 0 begin select top 1 @s = cast(rtrim(ltrim(substring(c1,2,charindex(''='',c1,1)-2))) as sysname)  , @on = case upper(cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as varchar(3))) when ''YES'' then 1 else 0 end from _t1 where left(c1,3) = ''@sc'' EXEC msdb.dbo.sp_update_jobschedule @job_name=@job_name, @name = @s, @enabled = @on delete _t1 where cast(rtrim(ltrim(substring(c1,2,charindex(''='',c1,1)-2))) as sysname)  = @s endset @on = 1set @traceid = 0if @stoptime < getdate() goto stoptraceset @cmd1 = ''dir '' + left(@tracefile,2) + '' | find "bytes free"''insert into _t1 exec master.dbo.xp_cmdshell @cmd1select @mbfree = cast(replace(substring(c1,charindex(''Dir'',c1)+6,charindex(''bytes free'',c1)       -(charindex(''Dir'',c1)+6)),'','','''') as bigint)/1024/1024  from _t1 where charindex(''bytes free'',c1) > 0delete _t1 where left([c1],1) != ''@''SELECT @traceid = traceid FROM :: fn_trace_getinfo(0) where property = 2 and value = @tracefileif upper(@p) != ''YES'' and upper(@b) != ''YES'' goto stoptraceif @traceid != 0 and @mbfree > @minMBfree goto finishif @mbfree <= @minMBfree goto disableif @traceid != 0 goto finishset @cmd1 = ''if exist '' + @tracefile + ''.trc '' + ''del '' + @tracefile + ''*.trc''exec @rc = master.dbo.xp_cmdshell @cmd1, no_outputif (@rc != 0) goto disableexec @rc = sp_trace_create @traceid output, @options, @tracefile, @maxfilesize, @stoptimeif (@rc != 0) goto disablegoto finishdisable:exec msdb.dbo.sp_update_job @job_name = @job_name, @enabled = 0stoptrace:exec sp_trace_setstatus @traceid, 0exec sp_trace_setstatus @traceid, 2finish:', @database_name = N'master', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 3, @on_fail_step_id = 0, @on_fail_action = 2  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 3, @step_name = N'SetEvents', @command = N'-- set trace events and filtersdeclare @traceid int, @tracefile  nvarchar (245), @rc int, @on bit, @cmd1 nvarchar(256), @events varchar(512), @columns varchar(512), @event int, @column int, @estart int, @enext int, @cstart int, @cnext int, @le int, @lc int, @filter nvarchar(245), @filter_num intset @on = 1set @traceid = 0select @tracefile = cast(ltrim(rtrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as nvarchar (245)) from _t1 where left(c1,3) = N''@tr''select @events=cast(ltrim(rtrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as nvarchar (512)) from _t1 where left(c1,3) = N''@ev''select @columns=cast(ltrim(rtrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as nvarchar (512)) from _t1 where left(c1,3) = N''@co''SELECT @traceid = traceid FROM :: fn_trace_getinfo(0) where property = 2 and value = @tracefileif @traceid = 0 goto finishif (SELECT count(*) FROM ::fn_trace_geteventinfo(@traceid)) > 0 goto finishselect @estart = 1select @enext = charindex('','',@events,@estart)select @cstart = 1select @cnext = charindex('','',@columns,@cstart)set @le = len(@events)set @lc = len(@columns)while @enext > 0 begin select @event = cast(substring(@events,@estart,@enext-@estart) as int) while @cnext > 0  begin  select @column = cast(substring(@columns,@cstart,@cnext-@cstart) as int)  exec sp_trace_setevent @traceid, @event, @column, @on  select @cstart = @cnext + 1  select @cnext = charindex('','',@columns,@cstart)  if @cnext = 0 set @cnext = @lc + 1  if @cstart >@lc set @cnext = 0  end select @cstart = 1 select @cnext = charindex('','',@columns,@cstart) select @estart = @enext + 1 select @enext = charindex('','',@events,@estart) if @enext = 0 set @enext = @le + 1 if @estart > @le set @enext = 0 endset @cmd1 = ''exec sp_trace_setfilter '' set @filter = N''none''select @filter = cast(ltrim(rtrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as nvarchar (245)) from _t1 where cast(ltrim(rtrim(substring(c1,1,charindex(''='',c1,1)-1))) as nvarchar (245)) = N''@filter1''set @filter_num = 2while @filter != N''none'' begin exec (@cmd1 + @traceid + '',''+@filter) set @filter_num = @filter_num + 1 set @filter = N''none'' select @filter = cast(ltrim(rtrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as nvarchar (245)) from _t1 where cast(ltrim(rtrim(substring(c1,1,charindex(''='',c1,1)-1))) as nvarchar (245)) = N''@filter'' + cast(@filter_num as nvarchar(3)) select @filter endfinish:exec sp_trace_setstatus @traceid, 1', @database_name = N'master', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 3, @on_fail_step_id = 0, @on_fail_action = 2  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 4, @step_name = N'blocking', @command = N'-- blocking checkdeclare @s table(id1 int identity, spid smallint, b smallint, d1 bit, ud binary(2540))declare @ud binary(2540), @id int, @spid smallint, @c nvarchar(128), @b varchar(3), @rc int,@ui nvarchar(128)select @b = cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as nvarchar (3))  from _t1 where left(c1,3) =  ''@bl''if upper(@b) != ''YES'' goto finishinsert into @s select spid, blocked, 0,cast(spid as binary(2))+cast(kpid as binary(2))+cast(blocked as binary(2))+waittype+cast(waittime as binary(4))+cast(lastwaittype as binary(64))+cast(waitresource as binary(512))+cast(dbid as binary(2))+cast(uid as binary(2))+cast(cpu as binary(4))+cast(physical_io as binary(8))+cast([memusage] as binary(4))+cast(login_time as binary(8))+cast(last_batch as binary(8)) +cast(ecid as binary(2))+cast(open_tran as binary(2))+cast(status as binary(60))+cast(sid as binary(86))+cast(hostname as binary(256))+cast(program_name as binary(256))+cast(hostprocess as binary(16))+cast(cmd as binary(32))+cast(nt_domain as binary(256))+cast(nt_username as binary(256))+cast(net_address as binary(24))+cast(net_library as binary(24))+cast(loginame as binary(256))+cast([context_info] as binary(128))+cast(l.rsc_text as binary(64))+cast(rsc_bin as binary(16))+cast(rsc_valblk as binary(16))+cast(rsc_dbid as binary(2))+cast(rsc_indid as binary(2))+cast(rsc_objid as binary(4))+cast(rsc_type as binary(1))+cast(rsc_flag as binary(1)) +cast(req_mode as binary(1))+cast(req_status as binary(1))+cast(req_refcnt as binary(2))+cast(req_cryrefcnt as binary(2))+cast(req_lifetime as binary(4))+cast(req_spid as binary(4))+cast(req_ecid as binary(4))+cast(req_ownertype as binary(2))+cast(req_transactionID as binary(8))+cast(req_transactionUOW as binary(16)) from master.dbo.sysprocesses p join master.dbo.syslockinfo l on p.spid = l.req_spid where (blocked != 0 or waittype != 0x0000) or (blocked = 0 and spid in (select blocked from master.dbo.sysprocesses where blocked != 0))if (select top 1 count(*) from @s) < 1 exec sp_trace_generateevent  82,  N''no block''elsebegin update @s set d1 = 1 where b = 0 and spid in (select b from @s where b != 0) while (select top 1 count(*) from @s where d1 = 1) > 0  begin  select top 1 @spid = spid from @s where d1 = 1  set @c = ''osql -S''+@@servername+'' -Q"dbcc traceon(3604) dbcc pss(0,''         + cast(@spid as nvarchar(3))+ '')" -o C:\pss.txt -w128''  exec @rc = master.dbo.xp_cmdshell @c, no_output  if (@rc = 0) bulk insert _t1 FROM ''C:\pss.txt''  delete _t1 where left([c1],2) = ''00''  update @s set d1 = 0 where spid = @spid  while (select top 1 count(*) from _t1 where left([c1],1) != ''@'') > 0   begin   select top 1 @ui = c1 from _t1 where left([c1],1) != ''@''   exec sp_trace_generateevent 82, @ui   delete _t1 where left(c1,5) = left(@ui,5)   end  set @c = ''del C:\pss.txt''  exec master.dbo.xp_cmdshell @c, no_output  end while (select top 1 count(*) from @s where d1 = 0) > 0  begin  select top 1 @id = id1, @ud = ud from @s where d1 = 0  exec sp_trace_generateevent 82, N''blocking'', @ud  delete @s where id1 = @id  endendfinish:', @database_name = N'master', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 3, @on_fail_step_id = 0, @on_fail_action = 2  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 5, @step_name = N'performance', @command = N'-- performance checkdeclare @s table (id1 int IDENTITY, UserData nvarchar(128))declare @UserData nvarchar(128), @id1 int, @p varchar(3), @b varchar(3), @rc int, @cmd nvarchar(80),@userinfo nvarchar(128), @row int, @lastrow intselect @p = cast(rtrim(ltrim(substring(c1,charindex(''='',c1,1)+1,len(c1)))) as nvarchar (3))  from _t1 where left(c1,3) =  ''@pe''if upper(@p) != ''YES'' goto finishinsert into @s select  left([object_name],40)+ left([counter_name],40)+ left([instance_name],35)+ cast([cntr_value] as nchar(11))  from master.dbo.sysperfinfo where cntr_value > 0while (select top 1 [id1] from @s) > 0 begin select top 1 @id1 = [id1], @UserData = [UserData] from @s exec sp_trace_generateevent @eventid = 83,  @userinfo = @UserData delete @s where [id1] = @id1 endfinish:if exists (select * from dbo.sysobjects where id = object_id(N''[_t1]'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)drop table [_t1]', @database_name = N'master', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 1, @on_fail_step_id = 0, @on_fail_action = 2  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1   IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   -- Add the job schedules.  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'schedule00seconds', @enabled = 1, @freq_type = 4, @active_start_date = 20001220, @active_start_time = 0, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 1, @freq_relative_interval = 0, @freq_recurrence_factor = 0, @active_end_date = 99991231, @active_end_time = 235959  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'schedule30seconds', @enabled = 1, @freq_type = 4, @active_start_date = 20001227, @active_start_time = 30, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 1, @freq_relative_interval = 0, @freq_recurrence_factor = 0, @active_end_date = 99991231, @active_end_time = 235959  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'schedule15seconds', @enabled = 1, @freq_type = 4, @active_start_date = 20001227, @active_start_time = 15, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 1, @freq_relative_interval = 0, @freq_recurrence_factor = 0, @active_end_date = 99991231, @active_end_time = 235959  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'schedule45seconds', @enabled = 1, @freq_type = 4, @active_start_date = 20001227, @active_start_time = 45, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 1, @freq_relative_interval = 0, @freq_recurrence_factor = 0, @active_end_date = 99991231, @active_end_time = 235959  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback   -- Add the Target Servers.  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N'(local)'   IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback ENDCOMMIT TRANSACTION          GOTO   EndSave              QuitWithRollback:  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave: 
Propriétés

ID d'article : 283696 - Dernière mise à jour : 11/07/2003 16:56:49 - Révision : 4.1

  • Microsoft SQL Server 2000 Standard
  • _ik kbinfo KB283696
Commentaires