Допустим, у нас есть следующая таблица Кассандры:
create table news(
date text,
source text,
category int,
id text,
title text,
tags text,
primary key ((date, source, category), id)
)
Теперь нам нужно поддерживать поиск по дате, категории и источнику:
select * from news where date in ('2019-01-23', '2019-01-24') and
category in (1, 4, 6) and source in ('Bloomberg', 'CNN');
Мне сказали, что этот запросбудет выполнять неоптимальное сравнение с тем же, где мы разбиваем все группы IN на отдельные запросы и объединяем результаты, используя UNION (12 подзапросов в случае выше).Причина заключается в том, что UNION будет разделен на 12 независимых запросов, и каждый из них может быть обработан одним из узлов в кластере (более 20 узлов), и мы начнем получать результаты быстрее.Предполагалось, что это будет быстрее и в том случае, если мы просто хотим убедиться, что количество возвращаемых строк ниже некоторого порога:
select count(*) (
select * from news where date in ('2019-01-23', '2019-01-24') and
category in (1, 4, 6) and source in ('Bloomberg', 'CNN') LIMIT 10001
);
Однако я не наблюдаю улучшения производительности как для небольших наборов результатов, так и длябольшие (250 тыс. строк).Я попробовал поискать в Google, но не смог найти ничего, что могло бы поддержать или доказать неверную гипотезу UNION.
Я использую Spark SQL (Hive 2) и драйвер Java CQL для доступа к данным в Cassandra.
Буду признателен за любую полезную информацию.
Спасибо