Непрерывные соединения JOIN
Непрерывные представления не ограничены возможностью выбирать данные только из потоков. Часто бывает полезно дополнить или объединить поступающие потоковые данные со статическими данными, хранящимися в таблицах Tantor PipelineDB. Это легко сделать, используя так называемые соединения «поток-таблица».
Соединения «поток-таблица»
Соединения «поток-таблица» работают путем соединения поступающего события с соответствующими строками, существующими в соединяемой таблице, на момент когда событие поступает. То есть, если в таблицу вставляются строки, которые соответствовали бы ранее прочитанным событиям, результат непрерывного представления, содержащего соединение «поток-таблица», не будет обновлен так, чтобы отразить это. Новые соединенные строки генерируются только во время чтения события. Даже если все строки в соединяемой таблице были удалены, результат непрерывного представления не изменится.
Поддерживаемые типы соединений
Потоки поддерживают только подмножество типов JOIN
. Соединения CROSS JOIN
и FULL JOIN
не поддерживаются. Соединения LEFT JOIN
и RIGHT JOIN
поддерживаются только тогда, когда поток находится на стороне соединения JOIN
, в котором возвращаются строки без совпадений. Для ANTI JOIN
и SEMI JOIN
требуется индекс на столбце отношения, по которому выполняется соединение.
Примеры
Подсчитайте количество событий, идентификаторы которых находились в таблице «whitelist» в какой-то момент времени:
CREATE VIEW count_whitelisted AS SELECT COUNT(*) FROM stream JOIN whitelist ON stream.id = whitelist.id;
Дополните входные данные пользователя более полной информацией о пользователе, хранящейся в таблице «users»:
CREATE 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 VIEW spatial AS SELECT cities.name, COUNT(*) FROM geo_stream, cities WHERE st_within(geo_stream.coords::geometry, cities.borders) GROUP BY cities.name;
Примечание
Как вы видите, соединения «поток-таблица», включающие большие таблицы, могут вызвать значительные затраты на производительность. Для достижения оптимальной производительности, таблицы, используемые для соединений «поток-таблица», должны быть относительно небольшими, в идеале они должны умещаться в память. Также рекомендуется создать индекс на столбцах таблиц, на которых выполняются соединения.
Соединения «поток-поток»
В настоящее время соединение «поток-поток» не поддерживается. Возможно оно будет доступно в будущих версиях Tantor PipelineDB.