Производительность Redshift: SQL-запросы против нормализации таблиц

Я работаю над созданием базы данных красных смещений, слушая события из разных источников и перекачивая эти данные в кластер красных смещений.

Идея состоит в том, чтобы использовать пожарный шланг Kinesis для перекачки данных в красное смещение с помощью команды COPY. Но у меня здесь дилемма: я хочу сначала запросить некоторую информацию из красного смещения, используя запрос выбора, такой как приведенный ниже:

select A, B, C from redshift__table where D='x' and E = 'y';

После получения необходимой информации от redshift я объединю эту информацию с данными уведомления о событии и отправлю запрос в kinesis. Затем Kinesis выполнит свою работу и выдаст требуемую команду COPY.

Теперь мой вопрос в том, стоит ли многократно запрашивать красное смещение, например, каждую секунду, поскольку это ожидаемое время, по истечении которого я буду получать уведомления о событиях?

Теперь позвольте мне описать альтернативный сценарий:

Если я нормализую свою таблицу и выделю некоторые поля в отдельную таблицу, тогда мне придется выполнять меньше запросов на красное смещение с нормализованным дизайном (может быть один раз в 30 секунд)

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

Поэтому я хочу знать на высоком уровне, какой подход будет лучше:

  1. Имейте одну плоскую таблицу, но запрашивайте ее перед отправкой запроса на кинезис при уведомлении о событии. При выполнении аналитики не будет никаких объединений таблиц.

  2. Используйте 2 таблицы и реже выполняйте запросы на красное смещение. Но выполните объединение таблиц при отображении результатов с помощью инструментов бизнес-аналитики / аналитики.

Как вы думаете, какой из этих двух вариантов лучше? Предположим, что в любом случае я буду использовать соответствующие ключи сортировки / ключи распределения.


comment
Что именно вы имеете в виду под нормализацией как в целом, так и здесь? Вероятно, что 1NF устранит неатомарные значения? Увы: лучший (1) ничего не значит, пока спрашивающий не определит его, и (2) зависит от стольких высокоуровневых и низкоуровневых деталей (использование, реализация, ресурсы, рентабельность), которые должны быть проверены эмпирически. Правильное распределение ключей - правильное направление. Постарайтесь найти лучшие и 2 дизайна, чтобы оценить и протестировать свой рабочий процесс и настройку.   -  person philipxy    schedule 18.06.2017
comment
Рекомендуется ли многократно запрашивать красное смещение, например, каждую секунду - Redshift не является базой данных в стиле OLTP, поэтому он оптимизирован для меньшего количества очень больших запросов, а не для множества очень маленьких запросов. Вы можете обнаружить, что время отклика в этом сценарии недостаточно велико для одного запроса в секунду. Вам также необходимо учитывать параллелизм (разрешенное количество одновременных запросов) - максимальное количество одновременных запросов в кластере составляет 50, поэтому ваш процесс будет использовать один из доступных слотов почти постоянно. docs.aws.amazon.com/ redshift / latest / dg /   -  person Nathan Griffiths    schedule 19.06.2017


Ответы (1)


Я бы определенно выбрал ваш второй вариант, который включает в себя СОЕДИНЕНИЕ с запросами. Это то, что умеет делать Amazon Redshift (особенно, если у вас правильно установлены SORTKEY и DISTKEY).

Позвольте потоковым данным поступать в Redshift наиболее эффективным образом, а затем присоединитесь при выполнении запросов. Так у вас будет намного меньше запросов.

В качестве альтернативы вы можете запустить обычное задание (например, ежечасно) для пакетной обработки данных в широкой таблице. Это зависит от того, как быстро вам нужно будет запросить данные после загрузки.

person John Rotenstein    schedule 18.06.2017
comment
Я тоже склоняюсь ко второму варианту. Думаю, так и будет. Так что я принимаю ваш ответ. Я просто хотел стартовать. Возможно, мне придется проверить это эмпирически. Спасибо! - person paratrooper; 19.06.2017