Запросы к столбцу, который не является частью PK или вторичного индекса - PullRequest
0 голосов
/ 23 мая 2018

Пожалуйста, помогите мне разрешить путаницу. Cassandra book Утверждает, что попытка запроса на основе столбца, который не является частью PK, не будет выполнена (вторичный индекс для этого столбца также отсутствует).Однако, когда я пытаюсь это сделать, я вижу следующее предупреждение:

Невозможно выполнить этот запрос, так как он может включать фильтрацию данных и, следовательно, может иметь непредсказуемую производительность.Если вы хотите выполнить этот запрос, несмотря на непредсказуемость производительности, используйте ALLOW FILTERING

Как только я добавлю ALLOW FILTERING к своему запросу, ошибки больше не будет.Я понимаю влияние на производительность - однако есть четкое противоречие с тем, что написано в книге.Была ли эта функция добавлена ​​позже или авторы книги просто пропустили это?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я думаю, это здорово, что у вас есть учебник, который поможет вам разобраться с важными концепциями noSQL, но не полагайтесь на него, поскольку CASSANDRA с открытым исходным кодом и постоянно обновляется сообществом.Онлайновые ресурсы, такие как официальная документация apache , являются гораздо лучшим вариантом для получения обновленной информации / руководств по новым и существующим функциям.

Хотя ALLOW FILTERING существует, все же рекомендуется использоватьдругая конструкция таблицы (например, смена столбца на ключ) или создание INDEX для быстрого выполнения запросов.

0 голосов
/ 23 мая 2018

AFAIK, у Кассандры есть ALLOW FILTERING с версии 1.

Также, чтобы объяснить ALLOW FILTERING,

Согласно документации по датастасу,

Давайте возьмемнапример, следующая таблица:

CREATE TABLE blogs (blogId int, 
                    time1 int, 
                    time2 int, 
                    author text, 
                    content text, 
                    PRIMARY KEY(blogId, time1, time2));

Если вы выполните следующий запрос:

SELECT * FROM blogs;

Cassandra вернет вам все данные, которые содержит таблица блогов.

Если вам теперь нужны только данные в указанное время1, вы естественным образом добавите равное условие в столбец time1:

SELECT * FROM blogs WHERE time1 = 1418306451235;

В ответ вы получите следующее сообщение об ошибке:

Bad Request: Невозможно выполнить этот запрос, так как он может включать фильтрацию данных и, следовательно, может иметь непредсказуемую производительность.Если вы хотите выполнить этот запрос, несмотря на непредсказуемость производительности, используйте ALLOW FILTERING.

Cassandra знает, что он не сможет выполнить запрос эффективным способом.Поэтому он предупреждает вас: «Будьте осторожны.Выполнение этого запроса как такового может быть не очень хорошей идеей, поскольку оно может использовать много ваших вычислительных ресурсов ».

Единственный способ, которым Cassandra может выполнить этот запрос, - это извлечь все строки из блогов таблицы, а затемотфильтровывать те, у которых нет запрошенного значения для столбца time1.

Если ваша таблица содержит, например, 1 миллион строк, и 95% из них имеют запрошенное значение для столбца time1, запрос все равно будетбыть относительно эффективным, и вы должны использовать ALLOW FILTERING.

С другой стороны, если ваша таблица содержит 1 миллион строк и только 2 строки содержат запрошенное значение для столбца time1, ваш запрос крайне неэффективен.Кассандра будет загружать 999, 998 рядов даром.Если запрос часто используется, вероятно, лучше добавить индекс для столбца time1.

К сожалению, у Cassandra нет возможности провести различие между двумя вышеупомянутыми случаями, поскольку они зависят от распределения данных таблицы,Поэтому Кассандра предупреждает вас и надеется сделать правильный выбор.

Спасибо,
Гарри

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...