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