Строка столбца Поиск / замена идентификаторов GUID - PullRequest
0 голосов
/ 21 июня 2011

У меня трассировка SQL Profiler сохранена в таблицу в SQL Server.

Я хочу выполнить анализ суммы / среднего значения / количества CPU / Чтений / Длительности для запросов в трассировке.Но большинство данных профилировщика записывает обращения к хранимым процедурам с параметрами uniqueidentifer:

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}')

Поэтому, когда я пытаюсь объединить данные трассировки профилировщика, чтобы найти худшие запросы:

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 уникален.Мне нужен какой-то способ заменить параметры uniqueidentifier общим маркером %g:

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?


Другие попытки взлома :

Trim *От 1023 * до первых 40 символов (то есть 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 соответствует.


Взлом, который я в итоге использовал, заключался в создании нового столбца Category, изначально нулевого.Затем я потратил два часа с тщательно отобранными предложениями LIKE, чтобы выбрать конкретный запрос, а затем «пометить» их все запросом.Например:

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 Ответ

1 голос
/ 21 июня 2011

Вы пытались использовать ClearTrace , который выполняет определенные параметризацию / нормализацию запроса?

Другой вариант - использовать функцию CLR: Определение плохо выполняющихся запросов для настройки из файлов трассировки рабочей нагрузки SQL Server

Всякий раз, когда вы собираете следы рабочей нагрузки в выявлять неэффективные запросы, вам нужно импортировать эти данные в таблицы базы данных, а также "нормализовать" и агрегировать эту информацию для идентификации худшие преступники. Это можно сделать разными способами. Одним из способов является определить регулярное выражение, такое как этот метод SQL CLR, основанный на проделанной работе Ицик Бен-Ган и модифицированный Адамом Machanic:

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

Редактирование OP : я не слышал о ClearTrace. я попробовал:

enter image description here

Редактировать : Вы использовали правильный шаблон трассировки для сбора трассы?

...