Непрерывные соединения JOIN

Непрерывные представления не ограничены возможностью выбирать данные только из потоков. Часто бывает полезно дополнить или объединить поступающие потоковые данные со статическими данными, хранящимися в таблицах PipelineDB. Это легко сделать, используя так называемые соединения «поток-таблица».

Соединения «поток-таблица»

Соединения «поток-таблица» работают путем соединения поступающего события с соответствующими строками, существующими в соединяемой таблице, на момент когда событие поступает. То есть, если в таблицу вставляются строки, которые соответствовали бы ранее прочитанным событиям, результат непрерывного представления, содержащего соединение «поток-таблица», не будет обновлен так, чтобы отразить это. Новые соединенные строки генерируются только во время чтения события. Даже если все строки в соединяемой таблице были удалены, результат непрерывного представления не изменится.

Поддерживаемые типы соединений

Добавлено в версии 0.9.2.

Потоки поддерживают только подмножество типов JOIN. Соединения CROSS JOIN и FULL JOIN не поддерживаются. Соединения LEFT JOIN и RIGHT JOIN поддерживаются только тогда, когда поток находится на стороне соединения JOIN, в котором возвращаются строки без совпадений. Для ANTI JOIN и :code:`SEMI JOIN`требуется индекс на столбце отношения, по которому выполняется соединение.

Примеры

  • Подсчитайте количество событий, идентификаторы которых находились в таблице «whitelist» в какой-то момент времени:

CREATE CONTINUOUS VIEW count_whitelisted AS SELECT COUNT(*) FROM
stream JOIN whitelist ON stream.id = whitelist.id;
  • Дополните входные данные пользователя более полной информацией о пользователе, хранящейся в таблице «users»:

CREATE CONTINUOUS VIEW augmented AS SELECT user_data.full_name, COUNT(*)
FROM stream JOIN user_data on stream.id::integer = user_data.id
GROUP BY user_data.full_name;
  • Пространственное соединение входящих координат с ближайшим городом и обобщение по названию города:

CREATE CONTINUOUS VIEW spatial AS SELECT cities.name, COUNT(*) FROM
geo_stream, cities WHERE st_within(geo_stream.coords::geometry, cities.borders)
GROUP BY cities.name;

Примечание

Как вы видите, соединения «поток-таблица», включающие большие таблицы, могут вызвать значительные затраты на производительность. Для достижения оптимальной производительности, таблицы, используемые для соединений «поток-таблица», должны быть относительно небольшими, в идеале они должны умещаться в память. Также рекомендуется создать индекс на столбцах таблиц, на которых выполняются соединения.

Соединения «поток-поток»

В настоящее время не поддерживается соединение «поток-поток», но оно может быть доступно в будущих версиях PipelineDB.