Чтобы избежать перекоса данных при их распределении в Greenplum, рекомендуется:
- Тщательно выбирать ключ распределения. 25 Распределение количества вхождений значений в нём должно быть как можно более равномерным. 5
- Не распространять столбцы, которые будут использоваться в условии WHERE, а также не задавать в качестве ключа дистрибуции дату или метку времени. 1
- Если один столбец не обеспечивает равномерное распределение, в качестве ключа дистрибуции можно использовать два столбца. 1
- Если ключ дистрибуции из двух столбцов не обеспечивает равномерное распределение данных, стоит использовать случайное распределение. 1 Однако оно не даёт гарантии равного количества записей в каждом сегменте. 1
- Для проверки перекоса можно использовать схему gptoolkit с представлениями gpskewcoefficients и gpskewidlefractions. 1 Для таблиц с перекосом более 10% следует пересмотреть политику распространения данных по сегментам. 1
Также для устранения перекоса в зависимости от ситуации можно применить следующий алгоритм: 4
- Если много уникальных значений в ключе распределения, то сначала следует выделить из таблицы ту часть строк, из-за которой возникает перекос (при этом необходимо распределить эту часть по уникальному ключу). 4 Затем выполняют необходимые вычисления отдельно для этих частей (при этом важно не допускать перераспределения той части, из-за которой возникал перекос). 4 И далее — объединяют результаты вычислений. 4
- Если мало уникальных значений в ключе распределения (и если характер вычислений позволяет работать только с уникальными ключами), то сначала группируются все записи по ключу распределения, выполняются вычисления. 4 Далее выполняется присоединение обратно к исходной таблице через broadcast. 4
Для более подробной консультации по оптимизации распределения данных в Greenplum рекомендуется обратиться к специалисту.