Мой единственный опыт, представляющий код C++, с AQTime AutomatedQA (теперь SmartBear Software). Это имеет несколько типов профилировщиков, встроил (производительность, память, дескрипторы Windows, трассировка исключения, статический анализ, и т.д.), и оснащает код для получения результатов.
я любил использовать его - это всегда была забава найти те пятна, где небольшое изменение в коде могло сделать поразительное улучшение производительности.
Как обычно с SQL, запрос в значительной степени нерелевантен, не зная, что фактическая схема используется против.
Есть ли у вас указатель на Members.Phone? Если нет, то не имеет значения, как вы пишете запрос, все они будут сканировать всю таблицу и выполнять то же самое (т. Е. Работать плохо). Если у вас есть индекс , то способ написания запроса имеет решающее значение:
SELECT * FROM Members WHERE Phone= @Phone;
SELECT * FROM Members WHERE Phone= dbo.FormatPhone(@Phone);
SELECT * FROM Members WHERE dbo.FormatPhone(Phone)=@Phone;
Первый запрос гарантированно оптимален, телефон будет искать по индексу.
Второй запрос зависит от характеристик dbo.FormatPhone. Он может использовать или не использовать оптимальный поиск.
Последний запрос гарантированно будет плохим. Сканируем стол.
Кроме того, я удалил подсказку NOLOCK, кажется, это тема дня ... См. Синтаксис для nolock в sql . NOLOCK - это всегда неправильный ответ. Использовать изоляцию моментальных снимков.
Вы почти наверняка получите лучшую предсказуемость, если сначала назначите переменной, много зависимостей в оптимизаторе между детерминизмом и недетерминизмом.
Второй вариант определенно предпочтительнее. Первый будет оценивать функцию для каждой строки в таблице, а второй - только один раз.
SELECT * FROM Members (NOLOCK)
WHERE Phone= dbo.FormatPhone(@Phone)
в запросе выше функция dbo.FormatPhone
будет выполняться для каждой строки в таблице Members
.
при втором запросе
Set @SomeVar = dbo.FormatPhone(@Phone)
SELECT *
FROM Members (NOLOCK) WHERE Phone= @SomeVar
он выполнит функцию только один раз. Поэтому я думаю, что второй вариант будет быстрее, если у вас есть большие данные в таблице элементов.