Наиболее эффективный способ получения первых N строк, соответствующих некоторому критерию для обычных (не кластеризованных) столбцов - PullRequest
0 голосов
/ 12 июня 2019

Я хочу вернуть первые N строк из фильтрации базы данных Cassandra по некоторому критерию, где фильтрация выполняется по обычным (не кластеризованным) столбцам.

Давайте предположим простую таблицукак это:

CREATE TABLE test(
  id UUID,
  timestamp TIMESTAMP,
  value DOUBLE,
  PRIMARY KEY ((id), timestamp)
) WITH CLUSTERING ORDER BY (timestamp ASC)

Опция 1

SELECT timestamp, value FROM test WHERE id=? AND value<? LIMIT ? ALLOW FILTERING

Это разрешено, но, как правило, ALLOW FILTERING следует избегать.Сказав это, действительно ли так плохо, если запрос касается только одного раздела?

Вариант 2 Установить очень маленький размер подкачки, например, N * 10 (скажем), а затем:

SELECT timestamp, value FROM test WHERE id=?

Читайте результаты по странице за раз и прекращайте чтение, как только будет прочитано достаточно подходящих строк.Есть ли какие-либо расходы, связанные со страницами, которые еще не были получены?Если нет, я бы догадался, что это явный победитель.

Опция 3 Пейджинг по умолчанию, ОГРАНИЧИТЬ количество результатов до N * 10, выполнить новый запрос, если вернулось недостаточно подходящих строк:

SELECT timestamp, value FROM test WHERE id=? AND timestamp>? LIMIT ?

Если в результатах недостаточно подходящих строк, введите новый запрос сразу после последнего результата предыдущего запроса timestamp.

Я хотел бы знать, что можетбудь лучшим вариантом.

1 Ответ

0 голосов
/ 13 июня 2019

Я сделал несколько грубых тестов. К моему удивлению, я обнаружил, что опция ALLOW FILTERING была на несколько порядков быстрее, по крайней мере, в моем тестовом сценарии. Два других параметра сильно зависели от LIMIT или размера страницы, а меньшая LIMIT / страница работала намного хуже.

Если первая подходящая строка найдена в результатах первой страницы / первого запроса, тогда эти три варианта не слишком далеки от сопоставимых, но ALLOW FILTERING по-прежнему все же самый быстрый.

Самым большим сюрпризом для меня было то, что листание по результатам одного большого запроса работает немного лучше, чем последовательное выполнение (то есть не одновременное) нескольких небольших запросов. Может ли быть так, что каждый раз, когда драйвер запрашивает следующую страницу результатов, Cassandra фактически выполняет новый запрос для этой страницы?

Ясно, что эти выводы сильно смещены запрашиваемым набором данных. Однако превосходство ALLOW FILTERING было настолько резким, что я бы сделал рабочее предположение, что это будет применимо практически во всех случаях.

...