Перейти к основному содержимому

Конфигурации Greenplum

Оптимизация производительности

Таблицы в Greenplum имеют мощные конфигурации оптимизации для улучшения производительности запросов:

  • распределение
  • ориентация столбцов
  • сжатие
  • переключатель appendonly
  • разделы

Указание этих значений в конфигурациях на уровне модели применяет соответствующие настройки в сгенерированной команде CREATE TABLE (кроме разделов). Обратите внимание, что эти настройки не будут иметь эффекта для моделей, установленных как view.

Распределение

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

По умолчанию dbt-greenplum распределяет данные RANDOMLY. Чтобы реализовать ключ распределения, вам нужно указать параметр distributed_by в конфигурации модели:

{{
config(
...
distributed_by='<field_name>'
...
)
}}


select ...

Также вы можете выбрать опцию DISTRIBUTED REPLICATED:

{{
config(
...
distributed_replicated=true
...
)
}}


select ...

Ориентация столбцов

Greenplum поддерживает два типа ориентации: строковую и столбцовую:

{{
config(
...
orientation='column'
...
)
}}


select ...

Сжатие

Сжатие позволяет уменьшить время чтения и записи. Greenplum предлагает несколько алгоритмов для сжатия таблиц с оптимизацией добавления:

  • RLE_TYPE (только для таблиц с ориентацией по столбцам)
  • ZLIB
  • ZSTD
  • QUICKLZ
{{
config(
...
appendonly='true',
compresstype='ZLIB',
compresslevel=3,
blocksize=32768
...
)
}}


select ...

Как вы можете видеть, вы также можете указать compresslevel и blocksize.

Разделы

Greenplum не поддерживает разделы с конструкцией create table as конструкция, поэтому вам нужно строить модель в два этапа:

  1. создать схему таблицы
  2. вставить данные

Чтобы реализовать разделы в вашей dbt-модели, вам нужно указать следующие параметры конфигурации:

  • fields_string - определение имен столбцов, типов и ограничений
  • raw_partition - спецификация раздела
{% set fields_string %}
some_filed int4 null,
date_field timestamp NULL
{% endset %}


{% set raw_partition %}
PARTITION BY RANGE (date_field)
(
START ('2021-01-01'::timestamp) INCLUSIVE
END ('2023-01-01'::timestamp) EXCLUSIVE
EVERY (INTERVAL '1 day'),
DEFAULT PARTITION default_part
);
{% endset %}

{{
config(
...
fields_string=fields_string,
raw_partition=raw_partition,
...
)
}}

select *
0