Непрерывные соединения 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.