HTML Diff
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