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

Откуда: Москва
Сообщений: 1176
Встала задача глобальной оптимизации базы.
Есть некий процесс, который тащит некий объем данных на клиент большим количеством запросов. При этом активно используются временные таблицы + много динамических запросов. Процесс выгребания, условно, занимает 5 минут.

Тестовый сервер (много процессоров, серверные диски) чувствует себя вполне комфортно, и не захлебывается, даже если запускать много таких процессов паралельно. Винты в потолок не упираются.

Куда смотреть? Что может быть узким местом?

Пс. В топе по io вызовы табличных неинлайновых функций
22 июн 15, 21:28    [17803747]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
+ в догонку клиент активно использует энтити фреймворк, и частенько мелькают простые дешевые однотипные запросы в таблицы выгоебающие по олной строке за раз. Насколько это может просаживать сервер?
22 июн 15, 21:31    [17803756]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Mike_za,

Это всё слишком абстрактно. Разумеется, получить данные одним запросом намного дешевле, чем кучей мелких. Примерно как написать в приложении "универсальную функцию получения байта из файла по имени", а потом использовать её вместо функций чтения файла (или блока из файла), используя кеши. хендлы, файы-объекты и т.д.

Но конкретно, насколько просядет, сказать трудно. Обычно навскидку замедление раз в 100 при таких архитектурных подходах, но конкретно в вашем случае может быть и меньше.
Вообще, тут много факторов, даже получение рекордсета можно написать с разницей в производительности в несколько раз, что уж говорить о реализации через пролучение одиночных записей.
22 июн 15, 22:46    [17804063]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Mike_za
Куда смотреть?
В профалйер.
Mike_za
Что может быть узким местом?
Все что угодно.
22 июн 15, 22:52    [17804093]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
alexeyvg,

А на что смотреть в первую очередь, ну или как убедиться, что какой-то из ресурсов сервера загружен на максимум.
При частой рекомпиляции процедур грузится процессор? Это может значительно просадить?
22 июн 15, 22:54    [17804111]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Mind, на что именно смотреть в профайлере? Цпу и ридс?
22 июн 15, 22:57    [17804124]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
alexeyvg,

Есть разница между сделать 10 селектов с клиента, и вызовом одну процы, которая выполнит эти 10 запросов?
22 июн 15, 23:02    [17804147]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Mike_za
Есть разница между сделать 10 селектов с клиента, и вызовом одну процы, которая выполнит эти 10 запросов?
Конечно есть, ведь вы делаете 10 актов обмена сервер-клиент, с прохождением обработки через многочисленные драйверы, библиотеки, сетевые карты, инкапсуляции протоколов, авторизации и проверки прав, ну и так далее.
Передать 10 рекордсетов тоже дороже, чем один, при одинаковых данных - ведь есть накладные расходы в любом протоколе обмена, в том числе высокого уровня (TDS), на всякие заголовки, описания типов.
Обработка на клиенте тоже дороже.

Далее, со стороны сиквела - многие из вышеперечисленных дополнительных расходов относятся и к сиквелу тоже.
Плюс к этому, чтение записей, скорее всего, будет дороже (примитивно говоря, прочситать за 10 раз 10 записей с 8КБ страницы БД, или прочитать просто за один раз эту страницу).

Не забываем и про то, что объекты лочатся до конца чтения данных клиентом, а это время примерно постоянно для каждого запроса.

Тут, как я говорил, просто изменением клиентского кода (самого процесса вызова) можно ускорить работу сервера в разы, не говоря о производительности системы в целом. А что уж говорить о концептуально-архитектурных изменениях...
Mike_za
При частой рекомпиляции процедур грузится процессор? Это может значительно просадить?
Рекомпиляция с этим не совсем связана, потому что при тыщах мелких запросах она может и отсутствовать (разве что память может больше расходоваться, но это тоже лечится).

Но, кроме рекомпиляции, ведь нужно ещё найти этот закешированный план, залочить нужные объекты, проверить права (ведь они могут поменяться в любой момент, это не закешировать), в общем, много всего, много дополнительных расходов.
22 июн 15, 23:18    [17804236]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Про рекомпиляцию, я имел ввиду доугую проблему: у нас много динамики + активное использование временных таблиц в качестве входных-выходных параметров у процедур.
22 июн 15, 23:22    [17804263]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
А если 100 мелких запросов выполнить одним скриптом из студии, это будет отличаться от вызова одной процедуры. Пусть запросы из разных таблиц
22 июн 15, 23:25    [17804282]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
alexeyvg
Mike_za
Есть разница между сделать 10 селектов с клиента, и вызовом одну процы, которая выполнит эти 10 запросов?
Плюс к этому, чтение записей, скорее всего, будет дороже (примитивно говоря, прочситать за 10 раз 10 записей с 8КБ страницы БД, или прочитать просто за один раз эту страницу)

Скажем, нужно получить список заказов для клиента.

Старый перд программист, вроде меня, напишет:
SELECT <поля, нужные для списка> FROM Order WHERE CustomerID = <клиент>

Послал запрос серверу.
Сервер найдёт план этого запроса.
Потом залочит диапазон индекса, найдёт по Б-дереву список ИД клиентов, залочит записи, или страницы, получит данные по этим коиентам, инкапсулирует в пакеты протокола, перешлёт клиенту.
Потом разлочит объекты.
Всё.

Умный ООП-мышко-программист с Умным Фрейворком сделает то же самое, но вернёт только ИД клиентов.

Далее, он создаст объекты, каждый из которых повторит весь вышеописанный процесс для каждого клиента.

Причём, разумеется, он запросит не <поля, нужные для списка>, а все поля заказа, в том числе например, фотку товаров на мегабайт.
А что, "а у меня DataAdapter", "универсальность", "а вдруг понадобится поле", "не делать же разные методы"...

Вот и считайте, во сколько раз упадёт производительность? Неизвестно, но я встречал и сотни раз, заменяли многопроцессорные SUN SPARC на дешёвенький x86 сервер, который потом ещё и прохлаждался.

Но, повторю, разумеется, всё зависит от конкретики, и плюсы у вашего подхода тоже есть. Например, разбиением на атомарные запросы легче делать распределение нагрузки на много серверов, это лучше обрабатывается на сильно-многопроцессорных системах.
Нужно анализировать работу именно вашей системы, максимально приближая нагрузочные тесты к реальной рабочей нагрузке.
22 июн 15, 23:35    [17804332]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Mike_za
Про рекомпиляцию, я имел ввиду доугую проблему: у нас много динамики + активное использование временных таблиц в качестве входных-выходных параметров у процедур.
А, понятно.
Да, тогда рекомпиляция может стать очень серьёзной проблемрой, она просто "валит" процесоры.
Mike_za
А если 100 мелких запросов выполнить одним скриптом из студии, это будет отличаться от вызова одной процедуры. Пусть запросы из разных таблиц
Не будет, это один батч, если, конечно, в тексте скрипта нет GO
22 июн 15, 23:36    [17804339]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
alexeyvg
Mike_za
Про рекомпиляцию, я имел ввиду доугую проблему: у нас много динамики + активное использование временных таблиц в качестве входных-выходных параметров у процедур.
А, понятно.
Да, тогда рекомпиляция может стать очень серьёзной проблемрой, она просто "валит" процесоры.
Mike_za
А если 100 мелких запросов выполнить одним скриптом из студии, это будет отличаться от вызова одной процедуры. Пусть запросы из разных таблиц
Не будет, это один батч, если, конечно, в тексте скрипта нет GO


И этот один батч пройдет через сеть с тем же расходом ресурсов, как если бы был в теле хранимой процедуры?

И еще вопрос. На н-ядерный сервер пришел 1 запрос. Сервер выполняет план без распаралеливания. Он одно ядро загрузит под 100%?
22 июн 15, 23:55    [17804430]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Mike_za
И этот один батч пройдет через сеть с тем же расходом ресурсов, как если бы был в теле хранимой процедуры?
Да, понятно, что расходы на вызов несколько батча несколько больше, я имел в виду выполнение.
Mike_za
И еще вопрос. На н-ядерный сервер пришел 1 запрос. Сервер выполняет план без распаралеливания. Он одно ядро загрузит под 100%?
Это слишком теоретический вопрос :-)
Любая одиночная процессорная команда загружает одно ядро на 100%. Вопрос только - на сколько времени? Одна команда на один такт, много команд на много тактов.

Конечно, один поток выполнения запросов загружает процессор на 100%
Но при выполнении запроса возникает много ожиданий ресурсов, и вот при этом поток выполнения простаивает, ожидая эти ресурсы.

Вообще соотношение времени выполнения и ожидания, и соответственно загрузку процессора для нераспаралеленного запроса можно хорошо видеть в профайлере, как соотношение полей Duration и CPU.
23 июн 15, 00:11    [17804469]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Mike_za
Пс. В топе по io вызовы табличных неинлайновых функций


Скорее всего надо переписать эти функции на инлайновые, так как в при запросе
select ... from func(...) where id = ...


Сервер сначала вытянет все данные, которые возвращает функция, а потом будет фильтровать.
Это обычно на два порядка (в 100 раз) медленнее, чем лукап по индексу.

Могу помочь вам с оптимизацией за небольшое вознаграждение. Много таким занимался. В рамках форума, не видя кода и запросов, это сделать невозможно.
23 июн 15, 00:50    [17804524]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
gandjustas, спасибо. Уже и своего опыта достаточно))))
тут скорее накопившиеся теоретические вопросы
23 июн 15, 09:47    [17805024]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
alexeyvg,спасибо.

А рекомпиляции процедуры попадают в дельту между цпу и дюрейшен?
23 июн 15, 09:49    [17805037]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Mike_za
Пс. В топе по io вызовы табличных неинлайновых функций
Такие функции еще дают нагрузку на журнал транзакций tempdb.
23 июн 15, 10:30    [17805263]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Mike_za
alexeyvg,спасибо.

А рекомпиляции процедуры попадают в дельту между цпу и дюрейшен?
Да. CPU - это всё время, компиляция тоже считается, и + само выполнение.
Ещё помню, что не учитывается CLR и extended proc, это мешает правильной оценке. Может, в новых версиях поправили?

И уверен, что не учтывается в CPU все остальные расходы на обработку запроса, типа транспорта. Но это конечно мелочь.
23 июн 15, 13:43    [17806565]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
alexeyvg,
а как- то можно управлять размером кеша планов?
23 июн 15, 16:42    [17807691]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Mike_za,

нельзя, оно их рассчитывает по зашитым в код sql server'а формулам и коэффициентам. чтобы размеры всех системных кусков памяти были пропорциональны друг-другу. почитайте всякие вайт паперы. для всех редакций по-разному. если и можно что-то подкрутить то каким-нибудь трейс флагом... хз каким.
23 июн 15, 17:08    [17807837]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Mike_za
alexeyvg,
а как- то можно управлять размером кеша планов?
Зачем?
23 июн 15, 20:15    [17808505]     Ответить | Цитировать Сообщить модератору
 Re: Много мелких запросов.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
А можно как то увидеть непосредственно время перекомпиляций? Событие в профайлере пустое. В самом плане запроса под временем компиляции, похоже, имеется ввиду еще и получение данных
24 июн 15, 01:27    [17809173]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить