Выполнение двух одинаковых запросов, но ключевое слово DISTINCT дает неожиданные результаты. Без ключевого слова результат нормальный, но с DISTINCT похоже, что предложение 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)
РЕДАКТИРОВАТЬ 1. Вот какой-то контекст.
Эта таблица "события" подвергается множеству операций записи, она получает около 1000 вставок в секунду, и у меня есть пакетный сценарий, который проверяет эти события каждые 5 минут.
У этого пакетного сценария 2 потребности:
1 - получить все идентификаторы пользователей, которые были активны за последние 5 минут (то есть каждый идентификатор пользователя, присутствующий в событиях за последние 5 минут);
2 - получить все события, связанные с этими идентификаторами пользователей (не только за последние 5 минут)
Раньше у меня было две разные таблицы, чтобы справиться с этим. Одна таблица «activeusers» для первого запроса и таблица «events», как я описал здесь, для второго запроса. Моя проблема в том, что от моего сервера требуется запись в две разные таблицы, когда он получает событие. Поэтому я попробовал это, используя только таблицу событий.
timestamp
как часть составного ключа. Я бы предложил использовать здесьtimeuuid
, чтобы предотвратить коллизии и перезапись записей.timestamp
, если все в порядке за пределами первичного ключа. - person dtoux   schedule 23.04.2015