Sql server 字符串列搜索/替换GUID

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)

我已将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) 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");
}