2016-03-16 3 views
0

Скажем, у меня есть таблицаКаковы подводные камни материализованных представлений Кассандры и запросов IN?

CREATE TABLE events (   
    stream_id text,   
    type text,   
    data text,   
    timestamp timestamp,   
    PRIMARY KEY (stream_id, timestamp) 
); 

Шаблон запроса является то, что мне нужно, чтобы получить все события, stream_id.
, например. SELECT * FROM events WHERE stream_id = 'A-1';

Тогда мне нужно получить все события с учетом набора type. Поэтому я создаю MV:

CREATE MATERIALIZED VIEW events_by_type AS 
    SELECT * FROM events 
    WHERE type IS NOT NULL AND 
    timestamp IS NOT NULL 
    PRIMARY KEY (type, stream_id, timestamp) 
    WITH CLUSTERING ORDER BY (timestamp DESC); 

Запрос похож
SELECT * FROM events_by_type WHERE type IN ('T1', 'T2);

Каковы подводные камни с этим шаблонов запросов и данных модели? Если есть, можно ли его улучшить?

ответ

2

Только ловушка Я могу думать, что вы можете нанести удар, так как согласованность с представлением не отражается на уровне согласованности записи в базовую таблицу. Поэтому, если вам нужна более сильная согласованность (кворум при чтении & пишет), вы можете столкнуться с проблемами.

Одна из проблем заключается в том, что ваши разделы не ограничены. В текущих версиях, если ваше здание размером более 100 мб или около того, вы можете начать иметь разные проблемы с производительностью (работает, но иногда требуется настройка GC, чтобы все перемещалось). Это улучшается в последнее время, но вы должны разбить свои разделы. т.е.

CREATE TABLE events (   
    stream_id text, 
    time_bucket text, 
    type text,   
    data text,   
    timestamp timestamp,   
    PRIMARY KEY ((stream_id, time_bucket), timestamp) 
); 

CREATE MATERIALIZED VIEW events_by_type AS 
    SELECT * FROM events WHERE 
    type IS NOT NULL AND 
    time_bucket IS NOT NULL AND 
    timestamp IS NOT NULL 
PRIMARY KEY ((type, time_bucket), stream_id, timestamp) 
WITH CLUSTERING ORDER BY (timestamp DESC); 

Это добавляет немного сложности в вашей time_bucket должны быть известен. Вы можете заранее определить ведра на что-то вроде ежедневного (то есть 2016-10-10 00:00:00) или создать новую таблицу, которая отображает возможные значения time_buckets для типа или stream_id.

+0

Спасибо за очень подробный ответ. Учитывая изменения, вы предлагаете, как я могу запросить все события stream_id? Или это time_bucket влияет только на то, как я пишу данные? Что касается согласованности, вы говорите, что запись кворума в базовую таблицу не гарантирует чтение кворума из MV. Я согласен с тем, что MV в конечном итоге соответствует базовой таблице. –

+0

просят «все» события для серии, я бы рекомендовал искру или по мере роста набора данных, это может занять слишком много времени. Если вы запрашиваете все события за определенный период времени, вы можете перебирать промежутки времени в этом диапазоне и выполнять запрос на каждый ведро. Поэтому, если ваше ведро времени составляет ГГГГ-ММ (ежемесячно), и вы хотите отчет за конец года, добавьте данные в свою обработку один месяц за раз. Его значительно более сложный, но имеющий дополнительную таблицу, которая содержит time_buckets для идентификатора потока, может сэкономить ваши потраченные впустую чтения. https://academy.datastax.com/demos/getting-started-time-series-data-modeling. –

+0

Спасибо большое! Принято. –

1

Это также может быть случай, когда старомодный вторичный индекс является разумным выбором. Предполагая, что существует достаточно ограниченное, но не крошечное количество типов, вторичный индекс может работать нормально. (Если имеется только небольшое количество разных типов, то вы можете столкнуться с проблемами с большими разделами в материализованном виде.)

+0

Существует около сотни видов. Это нормально? Я рассмотрю использование вторичного индекса. Благодарю. –

+0

Вторичный индекс в этом сценарии имел бы такие же проблемы, как MV, только вы не можете обойти его с помощью bucketing. Он создаст раздел для каждого типа, который будет неограниченно расти. Данные 2i по временным рядам очень редко будут работать. –

Смежные вопросы