Выполнение двух идентичных запросов, но ключевое слово DISTINCT дает неожиданные результаты. Без ключевого слова результат будет одобрен, но с DISTINCT, похоже, что предложение where игнорируется. Зачем ? версияSELECT DISTINCT cql игнорирует предложение WHERE
Cqlsh:
Connected to Test Cluster at localhost:9160.
[cqlsh 4.1.1 | Cassandra 2.0.6 | CQL spec 3.1.1 | Thrift protocol 19.39.0]
Таблица считается:
DESCRIBE TABLE events;
CREATE TABLE events (
userid uuid,
"timestamp" timestamp,
event_type text,
data text,
PRIMARY KEY (userid, "timestamp", event_type)
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
содержание таблицы:
SELECT * FROM events;
userid | timestamp | event_type | data
--------------------------------------+--------------------------+------------+------
aaaaaaaa-be1c-44ab-a0e8-f25cf6064b0e | 1970-01-17 09:06:17+0100 | toto | null
4271a78f-be1c-44ab-a0e8-f25cf6064b0e | 1970-01-17 09:06:17+0100 | toto | null
4271a78f-be1c-44ab-a0e8-f25cf6064b0e | 1970-01-17 09:07:17+0100 | toto | null
4271a78f-be1c-44ab-a0e8-f25cf6064b0e | 1970-01-17 09:08:17+0100 | toto | null
4271a78f-be1c-44ab-a0e8-f25cf6064b0e | 1970-01-17 09:09:17+0100 | toto | null
4271a78f-be1c-44ab-a0e8-f25cf6064b0e | 1970-01-17 09:10:17+0100 | toto | null
(6 rows)
Request1: Запрос без DISTINCT
SELECT userid FROM events WHERE timestamp > '1970-01-17 09:07:17+0100' ALLOW FILTERING;
userid
--------------------------------------
4271a78f-be1c-44ab-a0e8-f25cf6064b0e
4271a78f-be1c-44ab-a0e8-f25cf6064b0e
4271a78f-be1c-44ab-a0e8-f25cf6064b0e
(3 rows)
Request2: То же запрос с DISTINCT
SELECT DISTINCT userid FROM events WHERE timestamp > '1970-01-17 09:07:17+0100' ALLOW FILTERING;
userid
--------------------------------------
aaaaaaaa-be1c-44ab-a0e8-f25cf6064b0e
4271a78f-be1c-44ab-a0e8-f25cf6064b0e
(2 rows)
EDIT 1
здесь некоторый контекст.
Эта таблица «событий» подвержена множеству записей, она получает около ~ 1k вставки в секунду, и у меня есть пакетный скрипт, который проверяет эти события каждые 5 минут.
Этот пакетный сценарий имеет 2 потребности:
1- получить все UserIds, которые были активны в течение последних 5 минут (то есть каждый идентификатор пользователя присутствует в событиях за последние 5 минут)
2- получить все события, связанные с этими идентификаторами пользователей (не только последние 5 минут)
Раньше у меня были две разные таблицы. Одна таблица «активных пользователей» для первого запроса и таблица «событий», как я описал здесь для второго запроса. Моя проблема заключается только в том, что от моего сервера требуется писать в двух разных таблицах, когда он получает событие. Поэтому я попробовал это, используя только таблицу событий.
Просто наблюдение, но вы используете 'timestamp' как часть составного ключа. Я бы предложил использовать 'timeuuid' здесь, чтобы предотвратить коллизии и перезаписать записи. 'timestamp', если он отлично расположен вне первичного ключа. – dtoux
Является ли ваш столбец timestamp DESC? Похоже, вам нужно, чтобы это было заказано именно так. –