Вызов функции, в где пункт

Мой единственный опыт, представляющий код C++, с AQTime AutomatedQA (теперь SmartBear Software). Это имеет несколько типов профилировщиков, встроил (производительность, память, дескрипторы Windows, трассировка исключения, статический анализ, и т.д.), и оснащает код для получения результатов.

я любил использовать его - это всегда была забава найти те пятна, где небольшое изменение в коде могло сделать поразительное улучшение производительности.

7
задан noob.spt 12 November 2009 в 18:43
поделиться

4 ответа

Как обычно с 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 - это всегда неправильный ответ. Использовать изоляцию моментальных снимков.

8
ответ дан 6 December 2019 в 11:49
поделиться

Вы почти наверняка получите лучшую предсказуемость, если сначала назначите переменной, много зависимостей в оптимизаторе между детерминизмом и недетерминизмом.

5
ответ дан 6 December 2019 в 11:49
поделиться

Второй вариант определенно предпочтительнее. Первый будет оценивать функцию для каждой строки в таблице, а второй - только один раз.

4
ответ дан 6 December 2019 в 11:49
поделиться
SELECT * FROM Members (NOLOCK) 
WHERE Phone= dbo.FormatPhone(@Phone)

в запросе выше функция dbo.FormatPhone будет выполняться для каждой строки в таблице Members .

при втором запросе

Set @SomeVar = dbo.FormatPhone(@Phone) 

SELECT * 
FROM Members (NOLOCK) WHERE Phone= @SomeVar

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

0
ответ дан 6 December 2019 в 11:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: