Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Чем занят сервер, которому с избытком хватает ресурсов?  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
Собственно, возник вопрос. Если системный монитор показывает загрузку процессора не более 15%, запросов к дискам и сети почти нет, означает ли это, что аппаратных ресурсов SQL серверу достаточно?

Недавно запускал один запрос. Других параллельных пользователей и запросов не было. Около миллиона строк в одной таблице. Всего один джоин таблицы саму на себя, но по неприятному условию, включающему равно, больше, меньше и т.д. Были созданы разные варианты индекса с разным порядком колонок и включению в него всех требуемых данных. В итоге экспериментов подобрал конфигурацию индекса. План получился довольно простой. Обращений к таблице нет, только к индексу. Показывает один гигантский nested loop, включающий порядка миллиона просмотров индекса (да, миллион просмотров индекса из миллиона записей). SET STATISTICS IO ON показывает огромное количество логических чтений при нулевом количестве физических чтений.

Запрос выполнялся более 10 минут. Ну, я так подумал, что раз все данные засосало в оперативку, то узким местом является процессор. Обычно, если запускаешь программу, которая тормозит, она либо шуршит диском, либо гонит данные по сети, либо вычисляет процессором. И сильно удивился, когда системный монитор винды показал загрузку процессора 10% при выполняющемся запросе и 1% после завершения выполнения запроса.

Включил профайлер. Увидел огромное количество событий Scan:Started/Scan:Stopped и наложение блокировок. Поставил WITH(NOLOCK). Вместо 10 минут запрос стал выполняться за 9:59.

Отсюда возник вопрос, что же происходит в недрах SQL сервера? Как это посмотреть? Может, ему нехватает каких-то внутренних буферов в памяти? Может, разные части запроса выполняются разными потоками, которые друг-друга блокируют и ждут? Почему загрузка процессора такая низкая? Или nested loop научились делать без использования центрального процессора? Возникла мысль, что может влиять ядро вмвари, в которой крутится виртуалка. Интенсивное обращение к оперативной памяти внутри гостевой системы отжирает ресурсы вмвари и физического железа на хосте. Но, эти процессы не видны изнутри гостевой системы и не фиксируются системным монитором винды.

Сервер MS-SQL 2008 R2 64 bit.
8 июн 16, 18:26    [19272839]     Ответить | Цитировать Сообщить модератору
 Re: Чем занят сервер, которому с избытком хватает ресурсов?  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Dmitry V. Liseev
Показывает один гигантский nested loop, включающий порядка миллиона просмотров индекса (да, миллион просмотров индекса из миллиона записей). SET STATISTICS IO ON показывает огромное количество логических чтений при нулевом количестве физических чтений.
Значит ваше "неприятное условие" таково, что оптимизатор смог выбрать только NL.
Dmitry V. Liseev
Почему загрузка процессора такая низкая?
Потому что план выполнения у вас без параллелизма, следовательно выполняется на одном ядре.
8 июн 16, 19:21    [19273053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить