0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: dbt, amazon redshift, сжатие колоночных данных, алгоритмы кодирования, алгоритмы сжатия, zstd</p>
1
<p>Теги: dbt, amazon redshift, сжатие колоночных данных, алгоритмы кодирования, алгоритмы сжатия, zstd</p>
2
<h2>Основы</h2>
2
<h2>Основы</h2>
3
<p><strong>Amazon Redshift</strong>- это база данных, предназначенная, в первую очередь, для аналитики и запросов OLAP. Одна из ее ключевых функций - хранение данных в колоночном формате (columnar storage).</p>
3
<p><strong>Amazon Redshift</strong>- это база данных, предназначенная, в первую очередь, для аналитики и запросов OLAP. Одна из ее ключевых функций - хранение данных в колоночном формате (columnar storage).</p>
4
<p>Это позволяет хранить бОльшие объемы данных по сравнению со строковыми форматами (row storage), что становится возможным благодаря алгоритмам кодирования и однородной природе данных одного столбца (он очень хорошо сжимается).</p>
4
<p>Это позволяет хранить бОльшие объемы данных по сравнению со строковыми форматами (row storage), что становится возможным благодаря алгоритмам кодирования и однородной природе данных одного столбца (он очень хорошо сжимается).</p>
5
<p>По умолчанию, когда вы изначально создаете и заполняете таблицу, Redshift выбирает алгоритмы сжатия для каждого столбца самостоятельно.</p>
5
<p>По умолчанию, когда вы изначально создаете и заполняете таблицу, Redshift выбирает алгоритмы сжатия для каждого столбца самостоятельно.</p>
6
<p>Подробнее о кодировках сжатия Redshift можете почитать<a>здесь</a>.</p>
6
<p>Подробнее о кодировках сжатия Redshift можете почитать<a>здесь</a>.</p>
7
<h2>Вопрос о параметрах сжатия по умолчанию</h2>
7
<h2>Вопрос о параметрах сжатия по умолчанию</h2>
8
<p>Мне было интересно, можно ли применять более эффективные алгоритмы кодирования, чтобы сжимать данные еще эффективнее.</p>
8
<p>Мне было интересно, можно ли применять более эффективные алгоритмы кодирования, чтобы сжимать данные еще эффективнее.</p>
9
<p>К счастью, у нас есть команда ANALYZE COMPRESSION:</p>
9
<p>К счастью, у нас есть команда ANALYZE COMPRESSION:</p>
10
<p><em>Выполняет анализ сжатия и создает отчет с предлагаемой кодировкой сжатия для анализируемых таблиц. Для каждого столбца отчет включает оценку потенциального сокращения дискового пространства по сравнению с текущей кодировкой.</em></p>
10
<p><em>Выполняет анализ сжатия и создает отчет с предлагаемой кодировкой сжатия для анализируемых таблиц. Для каждого столбца отчет включает оценку потенциального сокращения дискового пространства по сравнению с текущей кодировкой.</em></p>
11
ANALYZE COMPRESSION hevo.wheely_prod_orders__backup COMPROWS 1000000 ;<p>Вот пример вывода:</p>
11
ANALYZE COMPRESSION hevo.wheely_prod_orders__backup COMPROWS 1000000 ;<p>Вот пример вывода:</p>
12
<p>Ваши следующие шаги:</p>
12
<p>Ваши следующие шаги:</p>
13
<ol><li>Создать новую таблицу с предложенными кодировками (возможно, с новыми ключами dist / sort).</li>
13
<ol><li>Создать новую таблицу с предложенными кодировками (возможно, с новыми ключами dist / sort).</li>
14
<li>Вставить данные в новую таблицу (сделать глубокую копию).</li>
14
<li>Вставить данные в новую таблицу (сделать глубокую копию).</li>
15
<li>Выполнить тесты и бенчмарки.</li>
15
<li>Выполнить тесты и бенчмарки.</li>
16
<li>Выполнить замену таблицы, удалить старую таблицу.</li>
16
<li>Выполнить замену таблицы, удалить старую таблицу.</li>
17
</ol><h2>Оберните это в автоматический макрос</h2>
17
</ol><h2>Оберните это в автоматический макрос</h2>
18
<p>Теперь, когда дело доходит до автоматизации рутинных операций или их выполнения, на ряде таблиц очень удобны такие фреймворки, как<a>dbt</a>.</p>
18
<p>Теперь, когда дело доходит до автоматизации рутинных операций или их выполнения, на ряде таблиц очень удобны такие фреймворки, как<a>dbt</a>.</p>
19
<p>С помощью макроса dbt можно автоматизировать весь цикл операций и даже поставить его на регулярную основу:</p>
19
<p>С помощью макроса dbt можно автоматизировать весь цикл операций и даже поставить его на регулярную основу:</p>
20
{{ redshift.compress_table('hevo', 'wheely_prod_orders', drop_backup=False, comprows=1000000) }}<p>Смотрите описание пакета<a>dbt Redshift</a>, а также<a>исходный код макроса сжатия</a>.</p>
20
{{ redshift.compress_table('hevo', 'wheely_prod_orders', drop_backup=False, comprows=1000000) }}<p>Смотрите описание пакета<a>dbt Redshift</a>, а также<a>исходный код макроса сжатия</a>.</p>
21
<p>Теперь давайте посмотрим на следующий код:</p>
21
<p>Теперь давайте посмотрим на следующий код:</p>
22
-- ensure new table does not exist yet drop table if exists "hevo"."wheely_prod_orders__compressed"; -- CREATE new table with new encodings create table "hevo"."wheely_prod_orders__compressed" ( -- COLUMNS "_id" VARCHAR(512) encode raw not null , "status" VARCHAR(512) encode zstd , "new_client" VARCHAR(512) encode zstd , "sorted_at" TIMESTAMP WITHOUT TIME ZONE encode az64 , "transfer_other_zone_id" VARCHAR(512) encode lzo , "ts" VARCHAR(512) encode lzo , ... -- CONSTRAINTS , PRIMARY KEY (_id) ) --KEYS -- DIST diststyle key distkey("_id") -- SORT compound sortkey("_id") ; -- perform deep copy insert into "hevo"."wheely_prod_orders__compressed" ( select * from "hevo"."wheely_prod_orders" ); -- perform atomic table interchange begin; -- drop table if exists "hevo"."wheely_prod_orders__backup" cascade; alter table "hevo"."wheely_prod_orders" rename to "wheely_prod_orders__backup"; alter table "hevo"."wheely_prod_orders__compressed" rename to "wheely_prod_orders"; commit;<h2>Оцениваем результаты</h2>
22
-- ensure new table does not exist yet drop table if exists "hevo"."wheely_prod_orders__compressed"; -- CREATE new table with new encodings create table "hevo"."wheely_prod_orders__compressed" ( -- COLUMNS "_id" VARCHAR(512) encode raw not null , "status" VARCHAR(512) encode zstd , "new_client" VARCHAR(512) encode zstd , "sorted_at" TIMESTAMP WITHOUT TIME ZONE encode az64 , "transfer_other_zone_id" VARCHAR(512) encode lzo , "ts" VARCHAR(512) encode lzo , ... -- CONSTRAINTS , PRIMARY KEY (_id) ) --KEYS -- DIST diststyle key distkey("_id") -- SORT compound sortkey("_id") ; -- perform deep copy insert into "hevo"."wheely_prod_orders__compressed" ( select * from "hevo"."wheely_prod_orders" ); -- perform atomic table interchange begin; -- drop table if exists "hevo"."wheely_prod_orders__backup" cascade; alter table "hevo"."wheely_prod_orders" rename to "wheely_prod_orders__backup"; alter table "hevo"."wheely_prod_orders__compressed" rename to "wheely_prod_orders"; commit;<h2>Оцениваем результаты</h2>
23
<p>Итак, я выполнил процедуру сжатия для нескольких таблиц, и теперь пришло время изучить результаты.</p>
23
<p>Итак, я выполнил процедуру сжатия для нескольких таблиц, и теперь пришло время изучить результаты.</p>
24
<p>Степень сжатия варьируется от 67 % до -9 %, что говорит о том, что автоматическое сжатие подходит не для всех случаев.</p>
24
<p>Степень сжатия варьируется от 67 % до -9 %, что говорит о том, что автоматическое сжатие подходит не для всех случаев.</p>
25
<p>Несмотря на то, что у нас есть 1 таблица с отрицательным результатом (<strong>obligations</strong>), мы видим сокращение использования дискового пространства в среднем на 21,5 % . Прежде чем применять какие-либо изменения, обязательно оцените производительность запросов и составьте список таблиц, которые необходимо сжать. В моем случае я сжимаю все таблицы, кроме<strong>obligations</strong>.</p>
25
<p>Несмотря на то, что у нас есть 1 таблица с отрицательным результатом (<strong>obligations</strong>), мы видим сокращение использования дискового пространства в среднем на 21,5 % . Прежде чем применять какие-либо изменения, обязательно оцените производительность запросов и составьте список таблиц, которые необходимо сжать. В моем случае я сжимаю все таблицы, кроме<strong>obligations</strong>.</p>
26
<h2>Ключевые результаты</h2>
26
<h2>Ключевые результаты</h2>
27
<p>Тщательно оцените результат и производительность запросов. Основная цель по-прежнему заключается в том, чтобы сохранить скорость и производительность запросов при одновременном улучшении использования диска и ввода-вывода (I/O).</p>
27
<p>Тщательно оцените результат и производительность запросов. Основная цель по-прежнему заключается в том, чтобы сохранить скорость и производительность запросов при одновременном улучшении использования диска и ввода-вывода (I/O).</p>
28
<p>Рассмотрим алгоритм сжатия<a>ZSTD</a>. Согласно<a>странице документа Redshift</a>:</p>
28
<p>Рассмотрим алгоритм сжатия<a>ZSTD</a>. Согласно<a>странице документа Redshift</a>:</p>
29
<p><em>Кодирование Zstandard (ZSTD) обеспечивает высокую степень сжатия с очень хорошей производительностью для различных наборов данных. ZSTD особенно хорошо работает со столбцами CHAR и VARCHAR, в которых хранится широкий спектр длинных и коротких строк, таких как описания продуктов, комментарии пользователей, журналы и строки JSON. Там, где некоторые алгоритмы, такие как кодирование<a>Delta</a>или кодирование<a>Mostly</a>, потенциально могут использовать больше места для хранения, чем без сжатия, ZSTD вряд ли увеличит использование диска.</em></p>
29
<p><em>Кодирование Zstandard (ZSTD) обеспечивает высокую степень сжатия с очень хорошей производительностью для различных наборов данных. ZSTD особенно хорошо работает со столбцами CHAR и VARCHAR, в которых хранится широкий спектр длинных и коротких строк, таких как описания продуктов, комментарии пользователей, журналы и строки JSON. Там, где некоторые алгоритмы, такие как кодирование<a>Delta</a>или кодирование<a>Mostly</a>, потенциально могут использовать больше места для хранения, чем без сжатия, ZSTD вряд ли увеличит использование диска.</em></p>
30
<ol><li>Оберните его в макрос, который можно будет запускать автоматически на регулярной основе.</li>
30
<ol><li>Оберните его в макрос, который можно будет запускать автоматически на регулярной основе.</li>
31
<li>Не стесняйтесь оставлять любые комментарии или вопросы.</li>
31
<li>Не стесняйтесь оставлять любые комментарии или вопросы.</li>
32
</ol><p><em><a>Версия этой статьи на английском</a>.</em></p>
32
</ol><p><em><a>Версия этой статьи на английском</a>.</em></p>
33
33