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

Откуда: Москва
Сообщений: 28
Доброго времени суток!

Не могу найти внятного описания ограничений на SQL запросы, чтобы они могли быть выполнены параллельно. Может ли кто дать ссылку или хотя бы примерно описать ограничения?

Конкретно интересует распараллеливание запросов с арифметическими и битовыми выражениями.

-- Этот эталонный запрос параллелится:
select * from table1 where field1 = 12345

-- Эти запросы НЕ параллелятся:
select * from table1 where field1 & 12345 = 12345
select * from table1 where field1 % 2 = 0
select * from table1 where field1 = field2

Почему? Есть ли способы заставить их распараллелиться?
23 июл 11, 00:30    [11015752]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения на параллельно выполняемые запросы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Параллель не панацея. Это раз.
Ну, посчитает сервер, что их выгодно параллелить - распараллелит. Это два.
Вашему второму и третьему запросу даже распараллеливание не поможет, первому и четвертому - шансы есть. Это три.

Сообщение было отредактировано: 23 июл 11, 00:34
23 июл 11, 00:33    [11015767]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения на параллельно выполняемые запросы  [new]
originator
Member

Откуда: Москва
Сообщений: 28
Сергей, а можно чуть подробнее на счет шансов?

Чем плох запрос №2, что его нельзя ускорить путем распараллелливания?

Если я буду производить аналогичные действия на C# над объектами в памяти - то ускорение налицо. На тестовом сервере 8 ядер - ускорение примерно в 7 раз. Мне это очень критично. На Production сервере 32 ядра, нужно выжать из них все.
23 июл 11, 00:46    [11015806]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения на параллельно выполняемые запросы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
originator
На Production сервере 32 ядра, нужно выжать из них все.
Хе-хе. Это не так-то просто.

originator
Чем плох запрос №2, что его нельзя ускорить путем распараллелливания?
Ну. В общем и целом, плох сканом талицы. Скан - это io, на которое проц нафиг не сдался, в общем-то.
23 июл 11, 01:19    [11015902]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения на параллельно выполняемые запросы  [new]
originator
Member

Откуда: Москва
Сообщений: 28
  • Для информации.

    Я провел небольшое исследование на тему распараллеливания выборок при НЕтрудоемких операциях сравнения. Как выяснилось, значительный выигрыш можно получить при объемах от десятков миллионов записей. Возможно, есть зависимость от размера записи - не проверял.

    Мой исходный пост неверен, MS SQL Server параллелит запросы с о всеми типами условий, но при наличии разного объема данных. Это меня и сбило с толку. Возможно это связано с тем, что он по-разному оценивает время выполнения.

    Итак, есть:
  • таблица 50 млн. записей
  • сервер 2хЕ5520 (4 ядра в каждом) + 16GB оперативки


    При выборках с проверкой битов (когда обычное индексирование неприменимо) происходит полный просмотр таблицы имеет место следующий результат (усредненно):
  • maxdop 1 - 8сек
  • maxdop 2 - 4сек
  • maxdop 4 - 2.5сек
  • maxdop 8 - 2сек
  • maxdop 16 - 1сек

    Данный результат, конечно же, имеет место быть, когда все данные прокешированы (размер таблицы всего 2.2 GB) и дисковый ввод-вывод отсутствует.

    С одной стороны, отличная масштабируемость, с другой стороны мелкая пакость: похоже, при переходе с 4 на 8 потоков SQL Server решил использовать гипертрединг, а не второй процессор. Видимо, нужно разрешить серверу использовать только по одной "половинке" каждого ядра. Осталось разобраться как они нумеруются ))

    Ниже приведен тестовый скрипт.

    -- Тестовая таблица
    create table Products
    (
    	ID bigint identity primary key,
    	BrandID bigint,
    	Styles bigint,
    	Colors bigint,
    	Sizes bigint
    );
    
    -- создаем 50 млн записей
    insert Products with(tablockx)
    (BrandID, Styles, Colors, Sizes)
    select top 50000000
    	abs(convert(bigint, convert(varbinary, NEWID())) % 100),
    	convert(bigint, convert(varbinary, NEWID())),
    	convert(bigint, convert(varbinary, NEWID())),
    	convert(bigint, convert(varbinary, NEWID()))
    from sys.all_columns c1, sys.all_columns c2, sys.all_columns c3
    
    
    -- тестовый запрос, результаты которого приведены выше
    select COUNT(*) from Products
    where BrandID % 100 = 0
    and Styles & 5120 = 5120
    and Colors & 268435584 = 268435584
    and Sizes & 24 = 24
    option(maxdop 1);
    

    Понятно, что такой подход может быть применен, когда конкурентные запросы не пересекаются на сервере. Но в случае низкой частоты поисков - отличная возможность улучшить отклик.
  • 24 июл 11, 20:29    [11020066]     Ответить | Цитировать Сообщить модератору
     Re: Ограничения на параллельно выполняемые запросы  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    originator
    С одной стороны, отличная масштабируемость, с другой стороны мелкая пакость: похоже, при переходе с 4 на 8 потоков SQL Server решил использовать гипертрединг, а не второй процессор.

    SQL Server не различает физические и логические процессоры
    25 июл 11, 11:03    [11021505]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить