Имя: Пароль:
1C
 
Обработка track_waitstats по замеру производительности
0 Nic1
 
08.07.09
15:08
В этой теме: "v7: Справочник 110 000 элементов - кинте плиз пример ускорения работы с таким" (Справочник 110 000 элементов - кинте плиз пример ускорения работы с таким приводилась ссылка на обработку по замеру производительности SQL-сервера:

http://www.infostart.ru/projects/2831/.

Попробовал мерять у себя, потом полез в код обработки, и не понял сути алгоритма. Насколько я понял, если, допустим, запустить EXEC track_waitstats 300, 1,
то он в течение 3 часов каждую минуту будет брать слепок статистики и записывать ее в табличку waitstats. А потом при сборе итогового отчета берет последний слепок статистики и по ней уже определяет максимальное время задержек и долю каждого вида задержки в общей массе.

Но зачем тогда ее запускать на 3 часа, если в итоге анализируются только последние данные?

Может я конечно чего-то недопонимаю, просветить плиз, кто разбирался в этом...
1 Nic1
 
08.07.09
15:12
Вот кстати код скрипта:
=========================================================

// тестирование SQL сервера
//
// После создания вызываешь EXEC track_waitstats 300, 1
//
// 300 - минуты скока мерить
// 1 - интервал в минутах


CREATE proc get_waitstats
AS

SET nocount ON

DECLARE @now datetime,@totalwait numeric(20,1)
  ,@endtime datetime,@begintime datetime
  ,@hr int,@min int,@sec int

SELECT  @now=max(now),@begintime=min(now),@endtime=max(now)
FROM waitstats WHERE [wait type] = 'Total'

-- Subtract waitfor, sleep, and resource_queue from total.
SELECT @totalwait = sum([wait time]) + 1 FROM waitstats WHERE [wait type] NOT IN ('WAITFOR','SLEEP','RESOURCE_QUEUE', 'Total',
 '***total***') AND now = @now

DELETE waitstats WHERE [wait type] = '***total***' AND now = @now INSERT INTO waitstats SELECT '***total***',0,@totalwait,@totalwait,@now

SELECT [wait type],[wait time],percentage=cast (100*[wait time]/@totalwait
 AS numeric(20,1))
FROM waitstats
WHERE [wait type] NOT IN ('WAITFOR','SLEEP','RESOURCE_QUEUE','Total')
AND now = @now
ORDER BY percentage desc

GO

CREATE proc track_waitstats (@num_samples int=10,@delaynum int=1,@delaytype
 nvarchar(10)='minutes')
AS

SET nocount ON
IF NOT EXISTS (SELECT 1 FROM sysobjects WHERE name = 'waitstats')
  CREATE table waitstats ([wait type] varchar(80),
     requests numeric(20,1),
     [wait time] numeric (20,1),
     [signal wait time] numeric(20,1),
     now datetime default getdate())
ELSE    truncate table waitstats
dbcc sqlperf (waitstats,clear)                            -- Clear out waitstats.
DECLARE @i int,@delay varchar(8),@dt varchar(3),@now datetime,
  @totalwait numeric(20,1),@endtime datetime,@begintime datetime,@hr int,
  @min int,@sec int
SELECT @i = 1
SELECT @dt = case lower(@delaytype)
  WHEN 'minutes' THEN 'm'
  WHEN 'minute' THEN 'm'
  WHEN 'min' THEN 'm'
  WHEN 'mm' THEN 'm'
  WHEN 'mi' THEN 'm'
  WHEN 'm' THEN 'm'
  WHEN 'seconds' THEN 's'
  WHEN 'second' THEN 's'
  WHEN 'sec' THEN 's'
  WHEN 'ss' THEN 's'
  WHEN 's' THEN 's'
  ELSE @delaytype
END
IF @dt NOT IN ('s','m')
BEGIN
  PRINT 'please supply delay type e.g. seconds or minutes'
  RETURN
END
IF @dt = 's'
BEGIN
  SELECT @sec = @delaynum % 60
  SELECT @min = cast((@delaynum / 60) AS int)
  SELECT @hr = cast((@min / 60) AS int)
  SELECT @min = @min % 60
END
IF @dt = 'm'
BEGIN
  SELECT @sec = 0
  SELECT @min = @delaynum % 60
  SELECT @hr = cast((@delaynum / 60) AS int) END SELECT @delay= right('0'+ convert(varchar(2),@hr),2) + ':' +
  + right('0'+convert(varchar(2),@min),2) + ':' +
  + right('0'+convert(varchar(2),@sec),2)
IF @hr > 23 or @min > 59 or @sec > 59
BEGIN
  SELECT 'hh:mm:ss delay time cannot > 23:59:59'
  SELECT 'delay interval and type: ' + convert (varchar(10),@delaynum) + ',' +
    @delaytype + ' converts to ' + @delay
  RETURN
END
WHILE (@i <= @num_samples)
BEGIN
            INSERT INTO waitstats ([wait type], requests, [wait time],[signal wait time])
  EXEC ('dbcc sqlperf(waitstats)')
  SELECT @i = @i + 1
  waitfor delay @delay
END
-- Create report.
EXECUTE get_waitstats

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
2 Nic1
 
08.07.09
15:59
P.S. Правда 300 - это 5 часов, а не 3...
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший