Как отличить время выполнения от общего количества времени, необходимого для запуска и возврата строк? - PullRequest
0 голосов
/ 13 ноября 2010

Когда я запускаю запрос, который возвращает миллионы строк из инструментов управления Sql, похоже, что запрос выполняется мгновенно.Насколько я могу судить, время исполнения практически отсутствует.То, что заставляет запрос занимать время, возвращает все строки.Это заставило меня задуматься, что я хорошо поработал!Но не так быстро ... Когда я смотрю на запрос в инструменте профилирования, он утверждает, что в запросе использовалось 7600 CPU.Длительность была 15000.

Я не уверен, что знаю, как интерпретировать эту статистику. С одной стороны, запрос кажется быстрым, но отчет профилировщика заставляет меня думать иначе.Почему запрос выполняется мгновенно в Mgmt Tools?Насколько я могу судить, очевидно, что должно быть какое-то отложенное выполнение: не менее 7600 мс.Мне нужно ждать дольше, чем статистика процессора и длительности, когда я запускаю запрос в инструментах mgmt, чтобы он завершил запрос.

1 Ответ

3 голосов
/ 13 ноября 2010

похоже, что запрос выполняется мгновенно Возможно, план запроса позволяет быстро возвращать строки.
Например, если вы сделаете SELECT * FROM a_large_table, вы сразу увидите несколько строк, но получение всего набора результатов займет некоторое время. Какое фактическое время выполнения сообщает Mgmt Studio (отображается в строке состояния после завершения запроса)?

Если вы хотите проверить производительность запроса без извлечения данных клиенту, вы можете сделать SELECT INTO #temp_table. Это потребует некоторого дополнительного ввода / вывода, но все равно даст вам довольно хорошую оценку времени выполнения.

UPD.
Вы также можете запустить что-то вроде SELECT COUNT(*) FROM (<your query here>) или SELECT SUM(<some field>) FROM (<your query here>) - если повезет, сервер выполнит запрос и агрегирует результат, в основном выполняя ту же работу плюс немного больше. Но это очень легко исказить результаты - оптимизатор запросов умный, и вы должны быть очень осторожны, чтобы убедиться, что вы измеряете то, что вы хотите измерить (потому что измерение запроса с другим планом выполнения не имеет никакого смысла вообще ).

Я предлагаю вам еще раз подумать, что вы хотите измерить и почему. В любом реальном сценарии вас не интересует «чистая» длительность запроса - потому что вы никогда не хотите отбрасывать результат запроса (результат - зачем вам этот запрос в первую очередь, верно?). Поэтому вам нужно либо вернуть результат клиенту, либо сохранить его где-нибудь, либо объединить его с другой таблицей и т. Д., И обычно вы хотите измерить выполнение запроса, включая время, использованное для обработки его результата.

Одно последнее уведомление. Если вы надеетесь, что сможете каким-то образом заставить сервер выполнить этот запрос за 1 секунду, потому что вы думаете, что сервер ничего не делает в течение других 13 секунд, вы ошибаетесь. Как говорится, SELECT не сломан.
Что может помочь, так это оптимизация запросов - и для одного запроса профилировщик вам мало поможет. Проанализируйте план запроса, настройте структуру таблицы, попробуйте переписать запрос, если возникнут проблемы, опубликуйте еще один вопрос на SO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...