Sql server 字符串列搜索/替换GUID
我已将SQL探查器跟踪保存到SQL Server中的表中 我想对跟踪中的查询执行CPU/Reads/Duration的sum/avg/count分析。但是,大多数探查器数据记录使用Sql server 字符串列搜索/替换GUID,sql-server,search,replace,sql-server-2000,profiling,Sql Server,Search,Replace,Sql Server 2000,Profiling,我已将SQL探查器跟踪保存到SQL Server中的表中 我想对跟踪中的查询执行CPU/Reads/Duration的sum/avg/count分析。但是,大多数探查器数据记录使用uniqueidentifer参数调用存储过程: 因此,当我尝试聚合探查器跟踪数据以查找性能最差的查询时: SELECT Description, COUNT(*) AS EventCount, AVG(CPU) AS CPU, SUM(CPU) AS CpuTotal, AVG(Reads)
uniqueidentifer
参数调用存储过程:
因此,当我尝试聚合探查器跟踪数据以查找性能最差的查询时:
SELECT
Description,
COUNT(*) AS EventCount,
AVG(CPU) AS CPU, SUM(CPU) AS CpuTotal,
AVG(Reads) AS Reads, SUM(Reads) AS ReadsTotal,
AVG(Duration) AS Duration, SUM(Duration) AS DurationTotal
FROM SlowQueriesTrace
GROUP BY Description
然后不会发生聚合,因为每个GUID都是唯一的。我需要的是用一个通用的%g
标记替换uniqueidentifier参数:
EXECUTE GetTransactionCounts @BankGUID = %g, @SessionGUID=%g
SELECT SUM(Total) AS Total FROM fn_BalancingAdditionsUS(%g)
EXEC CreateCloser %g, NULL , %g
EXECUTE GetMachineImpressmentForSession @SessionGUID = %g
SELECT SUM(Total) AS Total FROM fn_BalancingAdditionsCanadian(%g)
SELECT SUM(Total) AS Total FROM fn_BalancingSubtractionsUS(%g)
那么我的聚合就可以工作了
除了将表导出到Excel并手动编辑所有10270事件外,还有什么方法可以在SQL Server内部执行GUID搜索和替换模式匹配吗
我尝试过的其他黑客: 将
description
修剪为前40个字符(即CAST(描述为varchar(40))
):
除了合并不应该合并的项,其他不应该合并的项
使用SoundEx:
E223
S423
E220
E223
S423
除了你可以看到完全不同的线条被赋予相同的soundex。此外,我无法确定S338所对应的查询S338
我最后使用的方法是创建一个新的
Category
列,初始为空。然后,我花了两个小时仔细挑选LIKE
子句来挑选一个特定的查询,然后用查询“标记”它们。e、 g:
UPDATE QueryTrace
SET Category = 'EXECUTE GetTransactionCounts @BankGUID ='
WHERE Description LIKE 'EXECUTE GetTransactionCounts @BankGUID =%'
及
这并不意味着我不需要使用此问题的解决方案。您是否尝试过使用执行特定查询参数化/规范化的方法
另一个选项是使用CLR函数:
每当您将工作负载跟踪收集到
识别性能较差的查询,
您需要将此数据导入到
数据库表,并“规范化”和
汇总此信息以确定
最坏的罪犯。这是可以做到的
以各种方式。一种方法是
定义一个正则表达式,例如
此SQL CLR方法基于已完成的工作
由伊兹克·本·甘和亚当修改
机械的:
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic=true)]
公共静态SqlString sqlsig(SqlString querystring)
{
return(SqlString)Regex.Replace(
querystring.Value,
@“([\s,(=!](?![^\]+[\]]))(?:(?:(?:(?:)(?:(?))”
)(?:([N])?(')(?:[^']'')('))(?#字符
)(?:0x[\da-fA-F]*)(?#二进制)
)(?:[-+])(?:(?:[\d]*\.[\d]*[\d]+)(?#精确数字
)(?:[eE]?[\d]*))(?#不精确的数字
)(?:[~]?[-+]?(?:[\d]+)(?#整数)
)(?:[nN][uU][lL][lL])(?#空
))(?:[\s]?[\+-\*\/\%\&\\^][\s]?)+(?)运算符
)))",
@"$1$2$3#$4");
}
按OP编辑:我没有听说过ClearTrace。我试过:
编辑:您是否使用了正确的跟踪模板来收集跟踪?+1 ClearTrace正是这个方法。它易于使用,并且是专门为解决您正在处理的问题而构建的。希望不是唯一的方法。我已经多次使用ClearTrace,没有遇到这个错误
E223
S423
E220
E223
S423
UPDATE QueryTrace
SET Category = 'EXECUTE GetTransactionCounts @BankGUID ='
WHERE Description LIKE 'EXECUTE GetTransactionCounts @BankGUID =%'
UPDATE QueryTrace
SET Category = 'SELECT SUM(Total) AS Total FROM fn_BalancingAdditionsCanadian'
WHERE Description LIKE '%FROM fn_BalancingAdditionsCanadian%'
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]
public static SqlString sqlsig(SqlString querystring)
{
return (SqlString)Regex.Replace(
querystring.Value,
@"([\s,(=<>!](?![^\]]+[\]]))(?:(?:(?:(?:(?# expression coming
)(?:([N])?(')(?:[^']'')*('))(?# character
)(?:0x[\da-fA-F]*)(?# binary
)(?:[-+]?(?:(?:[\d]*\.[\d]*[\d]+)(?# precise number
)(?:[eE]?[\d]*)))(?# imprecise number
)(?:[~]?[-+]?(?:[\d]+))(?# integer
)(?:[nN][uU][lL][lL])(?# null
))(?:[\s]?[\+\-\*\/\%\&\\^][\s]?)?)+(?# operators
)))",
@"$1$2$3#$4");
}