Я получил эти таблицы
seen_ids таблица с идентификаторами.source_ids таблица нулевого движка, куда поступают данныеtarget_ids со свежими идентификаторами, которых не было в увиденном_ids на момент его появления.Мне нужно хранить только идентификаторы, которых нет в увиденных_идах:
CREATE materialized view mv_fresh
TO target_ids
AS SELECT
*
FROM source_ids where id not in (select id from seen_ids)
Также Id добавляется к seen_ids, поэтому в следующий раз он не будет добавлен к target_ids.
Другой вариант — использовать LEFT JOIN, но, возможно, для большой таблицы это тоже не лучшая идея.
Это пример того, что мне нужно сделать. Какие способы вы рекомендуете проверить на идентификаторы «недавно не видели»? Этот пример, вероятно, плохой дизайн для большой таблицы seen_ids (50 миллионов строк) и больших данных о доходах.





Несколько способов улучшить производительность:
CREATE materialized view mv_fresh
TO target_ids
AS SELECT
..
FROM source_ids
where id not in (
select id from seen_ids
where id IN (select id FROM source_ids))
db.seen_ids или использования пропуска индексовСм. Индексы пропуска: установите.
CREATE TABLE db.seen_ids_local ON CLUSTER cl
(..)
ORDER BY id
ENGINE = MergeTree()
SETTINGS index_granularity = 256 or 512 or ..;
Например, если id является инкрементальным, то можно применить некоторое условие WHERE id > {some_value_that_calculated_by_MV}
Имеет смысл рассмотреть возможность использования таблицы с движком SET для хранения просмотренных идентификаторов и использования их в операторе IN.
Это необходимо
db.source_idsНапример, для 2 шардов на каждом необходимо выполнить 50 / 2 = 25 mln ряды seen_ids таблицы.
CREATE TABLE db.seen_ids_local ON CLUSTER cl
(..)
ORDER BY id
ENGINE = MergeTree();
/* ! Write data to distributed table to reshard them among shards. Or write data directly to shard based on sharding key. */
CREATE TABLE db.seen_ids ON CLUSTER cl AS db.seen_ids_local
ENGINE = Distributed(cl, db, seen_ids_local, intHash32(id)); /* Reshard data by 'id'. */
CREATE TABLE db.source_ids_local ON CLUSTER cl
(..)
ENGINE = Null;
/* ! Write data to distributed table to reshard them among shards. */
CREATE TABLE db.source_ids ON CLUSTER cl AS db.source_ids_local
ENGINE = Distributed(cl, db, source_ids_local, intHash32(id)); /* Reshard data by 'id'. The same sharding key as for 'seen_ids' */
CREATE TABLE db.target_ids_local ON CLUSTER cl
(..)
ENGINE = MergeTree();
CREATE materialized view db.target_ids_local_mv
TO db.target_ids_local /* [Optional] Write data to local table */
AS SELECT
..
FROM db.source_ids_local /* !! Load data from local table */
where id not in (
select id from db.seen_ids_local /* !! Load data from local table */
)
Посмотрите эти документы: База знаний Altinity.
Большое спасибо, я попробую разные способы и надеюсь обновить вопрос своими показателями.