2011-06-21 21 views
0

SQLプロファイラトレースがSQL Serverのテーブルに保存されています。文字列GUIDの検索/置換

私は、トレース内のクエリでCPU/Reads/Durationの合計/平均/カウント分析を実行したいと考えています。私が最もパフォーマンスが悪いクエリを見つけるために、プロファイラトレースデータを集計しようとするので、

EXECUTE GetTransactionCounts @BankGUID = '{231281D7-F6C2-4EAE-98AE-E9196D8016F0}', @SessionGUID='{7F34361F-CEEA-4CEA-8CBD-2704FFE92DEF}' 
SELECT SUM(Total) AS Total FROM fn_BalancingAdditionsUS('{C08961DB-0B6A-4E67-A82B-5BBBA0A84A74}') 
EXEC CreateCloser '{7F34361F-CEEA-4CEA-8CBD-2704FFE92DEF}', NULL , '{08E74DBB-3BC4-49A7-AA10-95AA6BD24784}' 
EXECUTE GetMachineImpressmentForSession @SessionGUID = '{446881BA-1439-4AD8-B33B-C784120EFBA2}' 
SELECT SUM(Total) AS Total FROM fn_BalancingAdditionsCanadian('{446881BA-1439-4AD8-B33B-C784120EFBA2}') 
SELECT SUM(Total) AS Total FROM fn_BalancingSubtractionsUS('{446881BA-1439-4AD8-B33B-C784120EFBA2}') 

:しかし、プロファイラデータレコードのほとんどは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にエクスポートして10,270すべてのイベントを手作業で編集するのと同じように、GUID検索を実行する方法は何でも考えられます& SQL Server内のパターンマッチングを置き換えますか?

最初の40個の文字に

トリムdescription(すなわちCAST(description AS varchar(40))):

EXECUTE GetTransactionCounts @BankGUID = 
SELECT SUM(Total) AS Total FROM fn_Balan 
EXEC CreateCloser '{7F34361F-CEEA-4CEA-8 
EXECUTE GetMachineImpressmentForSession 
SELECT SUM(Total) AS Total FROM fn_Balan 
SELECT SUM(Total) AS Total FROM fn_Balan 

それがマージされるべきではないアイテムをマージ除いて、その他の項目


その他のハックは、私がを試してみました合併するべきではない。

使用SOUNDEX:あなたが同じ同音を与えられている全く異なるラインを見ることができることを除いて

E223 
S423 
E220 
E223 
S423 

。また、私はどのクエリS338が対応するかを判断することができません。私が使用して終了


ハックはinitallyヌル新しいCategory列を、作成することでした。次に、慎重に選択されたLIKE句で2時間を費やして、特定のクエリを取り出し、それらをすべてクエリに「タグ付け」しました。例えば:私はこの質問を使用してソリューションを必要としないという意味ではありません

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%' 

答えて

1

特定のクエリパラメータ化/正規化を実行するClearTraceを試しましたか?

別のオプションは、CLR機能を使用することです:Determining Poorly Performing Queries for Tuning from SQL Server Workload Trace Files

あなたはワークロードがパフォーマンスの低いクエリを特定 にトレースを収集するときはいつでも、 あなたは データベーステーブルにこのデータをインポートすると、「正常化」する必要があります この情報を集約して、最悪の犯罪者である を特定します。これはさまざまな方法で を実行することができます。 OPによって

[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"); 
} 

編集:一つの方法は、このSQL CLR方法Itzikベン・ガンにより を行った作業に基づいており、アダム Machanicによって変更など として正規表現を定義 にあります:私はClearTraceのことを聞いていなかった。私はそれを試してみました:

enter image description here

を編集:あなたは、トレースを収集するために右のトレーステンプレートを使用しましたか?

+1

+1 ClearTraceはここに行く方法です。それは使いやすく、あなたが扱っている問題を解決するために特別に作られています。 –

+0

願わくば唯一の方法ではありません。 –

+0

私は何度もClearTraceを使用しましたが、そのエラーは発生していません –

関連する問題