SELECT DISTINCT cql ignore clause where

L'exécution de deux demandes identiques, mais le mot-clé DISTINCT donne des résultats inattendus. Sans le mot clé, le résultat est ok, mais DISTINCTS, il ressemble à la clause where est ignoré. Pourquoi ?

Cqlsh version:

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]

Table considéré:

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'};

Du contenu de la Table:

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: Demande sans DISTINCTES

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: Même demande avec des

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

ici, le contexte est.

Cette table "les événements" est sujet à beaucoup de écrit, il reçoit environ 1k insertions par seconde et j'ai un lot de script qui vérifie ces événements toutes les 5 minutes.

Ce lot script a 2 besoins:

1 - obtenir tous les identifiants qui ont été actifs dans les 5 dernières minutes (j'.e chaque nom d'utilisateur présent dans les événements de ces 5 dernières minutes)

2 - obtenir tous les événements liés à ces identifiants (pas seulement pour les 5 dernières minutes)

J'ai utilisé deux tables différentes pour gérer cela. Une table "activeusers" pour la première demande et les "événements" de la table comme je l'ai décrit ici pour la deuxième demande. Mon problème c'est juste qu'elle a besoin de mon serveur à écrire dans deux tables différentes quand il reçoit un événement. J'ai donc essayé cela en utilisant seulement la table des événements.

Juste une observation, mais vous utilisez timestamp dans le cadre de la clé composée. Je conseille timeuuid ici pour prévenir les collisions et d'enregistrement écrase. timestamp si parfaitement bien à l'extérieur de la clé primaire.
Est votre colonne timestamp DESC? Semble que vous avez besoin, il a ordonné qu'.

OriginalL'auteur Diplow | 2014-10-24