Лучший порядок объединения и добавления к производительности

У меня огромные проблемы с производительностью при работе с SAS DI, которые мне нужны, чтобы начать работу. Поэтому я ищу умные способы оптимизировать работу.

В частности, я подумал о том, что мне следует изменить порядок некоторых соединений и дополнений. В настоящее время моя работа настроена следующим образом:

Есть несколько аналогично структурированных исходных таблиц, к которым я сначала применяю фильтр даты (чтобы уменьшить количество строк) и сортирую их, скажем, по двум полям. a а также bзатем я оставил присоединить каждую таблицу к таблице с таблицей счетов в тех же полях a а также b (Я хотел бы создать индексы для них, если это возможно, но не знаю, как это сделать для временных рабочих таблиц в SAS DI). После завершения каждого из этих объединений я добавляю полученные таблицы в один набор данных.

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

Итак, лучше ли сделать много объединений, чем добавить, или добавить, а затем сделать одно объединение?

РЕДАКТИРОВАТЬ

Вот обновление с некоторой соответствующей информацией (запрошено пользователем Robert Penridge).

  • Количество исходных таблиц здесь составляет 7, а размер этих таблиц колеблется от 1500 до 5,2 миллиона. 10 000 это типично. Количество столбцов - 25. Эти таблицы объединяются в одну и ту же таблицу, которая содержит около 5000 строк и 8 столбцов.
  • Я считаю, что уникальный ключ разбивает таблицы на подмножества примерно одинакового размера; уменьшение размера здесь должно составлять от 8% до 30% (разница связана с тем, что некоторые из исходных таблиц несут гораздо больше исторических данных, чем другие, увеличивая процентную долю таблицы, сгруппированной в одинаковое количество групп).
  • Я ограничил количество столбцов до требуемой минимальной суммы (21).
  • По умолчанию SAS DI создает все временные наборы данных как представления, и я не изменил это.
  • Код для добавления и объединения автоматически генерируется SAS DI после создания их с элементами GUI.
  • Окончательный набор данных не отсортирован; моя причина сортировки данных, которые подают в объединения, заключается в том, что в разделе этой ссылки о производительности объединения (стр. 35) упоминается, что это должно повысить производительность.
  • Как я уже упоминал, я не уверен, можно ли поместить индексы во временные рабочие таблицы или представления в SAS DI.
  • Я не могу сказать, больше ли ширина полей, чем это абсолютно необходимо, но если это так, я сомневаюсь, что это вопиюще. Я не решаюсь изменить это, так как это должно быть сделано вручную, для нескольких таблиц, и когда появляются новые данные, может потребоваться дополнительная ширина столбца.

Большая благодарность

2 ответа

По вашим комментариям кажется, что
1. Есть 7 входных исходных таблиц
2. Соедините эти 7 исходных таблиц с 1 таблицей
3. Добавить результаты

В SAS DI studio используйте Lookup, чтобы выполнить вышеупомянутое намного быстрее
1. Соедините 7 входных таблиц с преобразованием "Уточняющий запрос" (давайте назовем их SRC 1-7). 2. Таблица с 5000 записями - это таблицы, в которых выполняется поиск по ключам A и B (давайте назовем это LKUP-1) 3. Возьмите соответствующие столбцы из LKUP-1 для распространения в таблицах TARGET.

Это будет намного быстрее, и в этом случае вам не нужно выполнять JOINs, так как я подозреваю, что вы выполняете соединение Many-Many, что снижает производительность в SAS DIS.

Производительность в SAS в основном сводится к уменьшению ввода-вывода (т. Е. Чтения / записи на диск).

Без дополнительных деталей трудно помочь, но некоторые дополнительные вещи, которые вы можете рассмотреть:

  • ограничить количество обрабатываемых столбцов с помощью оператора keep (уменьшает количество операций ввода-вывода)
  • если шаги, выполняющие объединения, требуют интенсивного ввода-вывода, рассмотрите возможность использования представлений, а не создания временных таблиц
  • если объединения все еще занимают много времени, рассмотрите возможность замены их поисками в хэш-таблицах.
  • убедитесь, что вы используете proc append добавить 2 набора данных вместе, чтобы уменьшить IO. Добавьте меньший набор данных к большему набору данных.
  • не сортируйте окончательный набор данных, а размещайте на нем индекс для потребителей данных.
  • убедитесь, что вы используете какой-то тип сжатия набора данных, или убедитесь, что ширина столбцов установлена ​​соответствующим образом для всех столбцов (т. е. у вас нет ширины 200 в поле, которое использует ширину 8)
  • уменьшите количество строк как можно раньше (вы уже делаете это, просто перечислите это здесь для полноты)

Регулировка порядка левых соединений и добавлений, вероятно, не будет иметь такого большого значения, как при выполнении вышеописанного.

Другие вопросы по тегам