четверг, 6 сентября 2012 г.

SSIS компонент "Сортировка". Неправильное использование.

Мне очень не нравится компонент "Сортировка" в SSIS и одну из причин я уже описывал в посте Баг в компоненте Sort Transformation в SSIS 2008. Недавно столкнулся еще с одной очень вредной возможностью даннго компонента.

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


Если использовать эту галочку, то в результате на выходе получится результат с DISTINCT полями, указанными в списке сортировки. Вроде бы все хорошо и удобно, можно вместе с сортировкой сделать и агрегацию (GROUP BY), но если выбраны еще поля для PathThrough, и значения этих полей потом будут использоваться, то результат становится непредсказуемым.


Как показала практика, в результирующем наборе возвращаются значения первой попавшейся строки для полей, которые не входят в список сортировки, но помечены, как PathThrough. Пользователи часто жаловались, что после многократного запуска пакета не всегда одинаковый результат.

Чтобы избежать данного побочного эффекта, нужно либо включать все необходимые поля в сортировку и использовать Remove rows with duplicate sort values (что не всегда соответствует задаче), либо, что более правильно, использовать для агрегации соответствующую трансформацию "Aggregate".

1 комментарий:

  1. И мои пять копеек - как известно по поводу трансформации Sort - она относится к типу блокирующих асинхронных трансформаций, а это значит, что на больших наборах произойдет падение производительности. Про это написано здесь - http://msdn.microsoft.com/en-gb/library/dd795225(v=sql.100).aspx.

    Там же кстати, рекомендуют пользоваться ORDER BY вместо этой трансформации, если это возможно.

    ОтветитьУдалить