Нормализация данных в Redshift

Недавно я начал использовать Redshift для размещения миллионов точек данных со схемой, которая выглядит следующим образом:

create table metrics (
  name varchar(100),
  value decimal(18,4),
  time timestamp
) sortkey (name, timestamp);

(Настоящая схема немного сложнее, но это удовлетворит мой вопрос)

Мне интересно, имеет ли смысл нормализовать имя моей метрики (в настоящее время varchar (100)), сопоставив его с целым числом и сохранив только целое число. (например, {id: 1, имя: metric1}). Количество элементов для name равно ~100. Добавление сопоставления сделало бы логику приложения немного более сложной, поскольку оно имеет много потоков ввода. Кроме того, запрос к нему заранее потребует обратного сопоставления.

В традиционной базе данных sql это было бы очевидным ДА, но я не уверен, как Redshift справляется с этим, поскольку это столбцовое хранилище данных. Я думаю, что было бы неплохо иметь в целом, но я предполагаю, что Redshift может/мог бы сделать некоторое подобное отображение под капотом, поскольку некоторые столбцы в любой таблице имеют меньшую кардинальность, чем другие.


person Tony Meng    schedule 20.06.2014    source источник


Ответы (2)


Ответ - нет. Redshift отлично использует сжатие и будет хранить очень мало дубликатов поля вашего имени.

Однако вам необходимо убедиться, что вы правильно используете параметры сжатия Redshift. Этот раздел документации должен рассказать вам все, что вам нужно знать: http://docs.aws.amazon.com/redshift/latest/dg/t_Compressing_data_on_disk.html

TL;DR: запустите ANALYZE COMPRESSION на своей таблице, чтобы увидеть, какое сжатие рекомендует Redshift, создайте новую таблицу, используя эти кодировки, и вставьте свои данные в эту таблицу.

person Joe Harris    schedule 23.06.2014

Лучше всего продолжать использовать тип данных varchar, как здесь, но применять тип сжатия «bytedict». Внутренне это то же самое, что и создание таблицы поиска, но на самом деле это может быть быстрее, поскольку Redshift изначально понимает, как управляет собственной таблицей, и внутренне сопоставляется с int->string во время декодирования столбца.

Вот ссылка на документ bytedict: http://docs.aws.amazon.com/redshift/latest/dg/c_Byte_dictionary_encoding.html

Другим вариантом, который может дать вам хорошую экономию производительности/хранилища для ваших вариантов использования, является длина выполнения: http://docs.aws.amazon.com/redshift/latest/dg/c_Runlength_encoding.html

person aaronsteers    schedule 21.07.2016