Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 анализ результатов профайлера  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
может велосипед сделал, но мне пригодилось.

вытаскивает имя таблицы из запроса - проще статистику подбить - например какой процесс как грузит таблицы.

функция парсит текст в надежде вытащить ключевые слова, похожие на имя таблицы
if object_id('dbo.fn_Parser') is not null drop FUNCTION dbo.fn_Parser
go
CREATE FUNCTION fn_Parser( @ps ntext )
RETURNS @tbl TABLE (name nvarchar(255))
AS
begin
declare	@s	nvarchar(2000)
set @s = CONVERT(nvarchar(2000), @ps)
declare	@cut	nvarchar(2000)
declare	@c char(1)
set @c = ' '
while	1=1	begin
	declare	@i	int, @j int
	select	@i	= charindex( @c, @s )
	if	@i = 0	begin
		select	@cut	= @s
		select	@s	= ''
	end	else
	if	@i = 1	begin
		select	@s	= substring( @s, 2, len( @s ))
		continue
	end	else	begin
		select	@cut	= substring( @s, 1, @i-1 )
		select	@s	= substring( @s, @i+1, len( @s ))
	end
	if left(@cut,1) >= 'a' or left(@cut,1) = '_' or left(@cut,1) = '#' begin
		if right(@cut,1) = ',' and len(@cut) > 1  -- cut off last comma
			set @cut = substring( @cut, 1, len(@cut)-1)
		while right(@cut,1) = ')' or right(@cut,1) = '''' 
			set @cut = substring( @cut, 1, len(@cut)-1)
	set @cut = PARSENAME ( @cut , 1 ) -- take only object name

	if @cut not in ('N', 'update', 'sp_executesql', 'set', 'where', 'ID', 'datetime', 'insert', 'delete', 'exec', 'select', 'from') 
		and charindex( ',', @cut ) = 0 and charindex( '''', @cut ) = 0
		insert into @tbl (name) values (@cut)
	end 
	if	@s = ''
		break
end
RETURN 	
end
GO

функция возвращает первую таблицу, чье имя реально существует и совпало со списком из предидущей функции


if object_id('dbo.fParserSQL') is not null drop FUNCTION dbo.fParserSQL
go
CREATE FUNCTION fParserSQL( @s ntext )
RETURNS nvarchar(255)
AS
begin
declare @val nvarchar(255)
select top 1 @val = name from fn_Parser( @s ) where name in (select name from BESMgmt.dbo.sysobjects where xtype='U' )
RETURN @val
end
go

вот так применять к таблице, в которую слиты результаты профайлера :


select rownumber, eventclass, db2.dbo.fn_ParserSQL(aa.textdata) as tbl, clientprocessid, applicationname, duration, reads, writes, cpu  from aa  order by 3
14 апр 05, 22:09    [1470091]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить