Я заметил, что AWS Redshift рекомендует различные кодировки сжатия столбцов из тех, которые он автоматически создает при загрузке данных (через COPY) в пустую таблицу.
Например, я создал таблицу и загрузил данные из S3 следующим образом:
CREATE TABLE Client (Id varchar(511) , ClientId integer , CreatedOn timestamp,
UpdatedOn timestamp , DeletedOn timestamp , LockVersion integer , RegionId
varchar(511) , OfficeId varchar(511) , CountryId varchar(511) ,
FirstContactDate timestamp , DidExistPre boolean , IsActive boolean ,
StatusReason integer , CreatedById varchar(511) , IsLocked boolean ,
LockType integer , KeyWorker varchar(511) , InactiveDate timestamp ,
Current_Flag varchar(511) );
Клиент таблицы создан Время выполнения: 0,3 с
copy Client from 's3://<bucket-name>/<folder>/Client.csv'
credentials 'aws_access_key_id=<access key>; aws_secret_access_key=<secret>'
csv fillrecord truncatecolumns ignoreheader 1 timeformat as 'YYYY-MM-
DDTHH:MI:SS' gzip acceptinvchars compupdate on region 'ap-southeast-2';
Предупреждения: загрузка в «клиентский стол» завершена, 24284 записей успешно загружены. Загрузка в таблицу «клиент» завершена, на 6 записей были загружены замены, сделанные для ACCEPTINVCHARS. Подробнее см. Системную таблицу 'stl_replacements'.
Удалено 0 строк. КОПИРОВАНИЕ выполнено успешно.
Время выполнения: 3.39s
Сделав это, я могу посмотреть кодировки сжатия столбцов, которые были применены COPY:
select "column", type, encoding, distkey, sortkey, "notnull"
from pg_table_def where tablename = 'client';
Предоставление:
â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•╦â•â•â•╦â•â•â•â•â•â•â•â•—
â•‘ id â•‘ character varying(511) â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ clientid â•‘ integer â•‘ delta â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ createdon â•‘ timestamp without time zone â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ updatedon â•‘ timestamp without time zone â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ deletedon â•‘ timestamp without time zone â•‘ none â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ lockversion â•‘ integer â•‘ delta â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ regionid â•‘ character varying(511) â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ officeid â•‘ character varying(511) â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ countryid â•‘ character varying(511) â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ firstcontactdate â•‘ timestamp without time zone â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ didexistprecirts â•‘ boolean â•‘ none â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ isactive â•‘ boolean â•‘ none â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ statusreason â•‘ integer â•‘ none â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ createdbyid â•‘ character varying(511) â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ islocked â•‘ boolean â•‘ none â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ locktype â•‘ integer â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ keyworker â•‘ character varying(511) â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ inactivedate â•‘ timestamp without time zone â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
â•‘ current_flag â•‘ character varying(511) â•‘ lzo â•‘ false â•‘ 0 â•‘ false â•‘
╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•©â•â•â•â•©â•â•â•â•â•â•â•â•
Тогда я могу:
analyze compression client;
Предоставление:
â•”â•â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•â•—
â•‘ client â•‘ id â•‘ zstd â•‘ 40.59 â•‘
â•‘ client â•‘ clientid â•‘ delta â•‘ 0.00 â•‘
â•‘ client â•‘ createdon â•‘ zstd â•‘ 19.85 â•‘
â•‘ client â•‘ updatedon â•‘ zstd â•‘ 12.59 â•‘
â•‘ client â•‘ deletedon â•‘ raw â•‘ 0.00 â•‘
â•‘ client â•‘ lockversion â•‘ zstd â•‘ 39.12 â•‘
â•‘ client â•‘ regionid â•‘ zstd â•‘ 54.47 â•‘
â•‘ client â•‘ officeid â•‘ zstd â•‘ 88.84 â•‘
â•‘ client â•‘ countryid â•‘ zstd â•‘ 79.13 â•‘
â•‘ client â•‘ firstcontactdate â•‘ zstd â•‘ 22.31 â•‘
â•‘ client â•‘ didexistprecirts â•‘ raw â•‘ 0.00 â•‘
â•‘ client â•‘ isactive â•‘ raw â•‘ 0.00 â•‘
â•‘ client â•‘ statusreason â•‘ raw â•‘ 0.00 â•‘
â•‘ client â•‘ createdbyid â•‘ zstd â•‘ 52.43 â•‘
â•‘ client â•‘ islocked â•‘ raw â•‘ 0.00 â•‘
â•‘ client â•‘ locktype â•‘ zstd â•‘ 63.01 â•‘
â•‘ client â•‘ keyworker â•‘ zstd â•‘ 38.79 â•‘
â•‘ client â•‘ inactivedate â•‘ zstd â•‘ 25.40 â•‘
â•‘ client â•‘ current_flag â•‘ zstd â•‘ 90.51 â•‘
╚â•â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•
т.е. совершенно разные результаты.
Я очень хочу знать, почему это возможно? Я получаю, что записи ~ 24K меньше, чем 100K, которые AWS указывает как необходимые для значимого примера анализа сжатия, однако по-прежнему кажется странным, что COPY и ANALYZE дают разные результаты для одной и той же таблицы строк 24K.
COPY в настоящее время не рекомендует ZSTD, поэтому рекомендуемые параметры сжатия различны.
Если вы хотите применить сжатие на постоянных таблицах, где вы хотите максимизировать сжатие (используйте наименьшее количество места), установка ZSTD по всей доске даст вам оптимальное сжатие.
Причина, по которой RAW возвращается на некоторые столбцы, заключается в том, что в этом случае нет никакого преимущества для применения сжатия (столько же блоков с сжатием и без него). Если вы знаете, что таблица будет расти, имеет смысл применять сжатие для этих столбцов.