Контроль распараллеливания

Я запускаю пользовательский процессор в наборе строк, который, похоже, не работает параллельно. Базовый текстовый файл объемом ~ 1 ГБ сначала считывается в таблицу, которая разбита на разделы с помощью циклического перебора. «Извлечение» выполняется на 200 вершинах, но затем (в узле «Агрегат») обработка [которая выполняет различные сложные вычисления] происходит только на 2 вершинах, хотя параметр параллелизма намного выше этого. Есть ли специальный намек, который нужно использовать, чтобы заставить компилятор использовать больше вершин? Есть ли функция или свойство, которые необходимо переопределить, чтобы установить параллелизм и на этом этапе?


person chi    schedule 24.12.2015    source источник


Ответы (1)


Извините за задержку с ответом. Но это время отпуска :).

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

Не видя скрипт или сгенерированный план, немного сложно сказать, почему вы видите только 2 вершины в некоторых местах. Есть несколько причин, почему это может быть так:

  1. у вас недостаточно данных для увеличения масштаба.
  2. вашей агрегации требуется больше данных, и поэтому план имеет меньший параллелизм.
  3. ваша операция по своей сути менее параллельна.
  4. Оценка кардинальности данных оптимизатора отключена и выбирает недостаточный параллелизм. У нас есть некоторая способность намекать, но я скорее сначала увижу задание.

Обратите внимание, что пользовательские процессоры часто блокируют оптимизатор от проталкивания оптимизаций в сценарий (например, помогает использование параметра ТОЛЬКО ДЛЯ ЧТЕНИЯ) и могут отбрасывать оценки кардинальности.

Если вы пришлете мне сценарий, график вакансий и ссылку на вакансию в mrys в Microsoft, мы с командой изучим ее на следующей неделе после окончания праздников.

person Michael Rys    schedule 30.12.2015
comment
Я заметил, что оставил этот вопрос без ответа, поэтому позвольте мне закрыть цикл, чтобы сообщить сообществу о решении. Поскольку компилятор не видит, что делает пользовательский процессор, его сложнее распараллелить, и это должно быть вашим последним средством. Я привнес то, что делал пользовательский процессор, во встроенные инструкции u-sql С# настолько, насколько это возможно, и увидел заметную разницу. Спасибо, Майкл! - person chi; 04.03.2016
comment
Рад слышать! И если вы можете избежать использования пользовательских процессоров, переместив код в пользовательские функции, вы обычно получаете лучшую производительность и масштабируемость. - person Michael Rys; 04.03.2016