Что означает "PER PARTITION LIMIT" в запросе cql в cassandra? - PullRequest
1 голос
/ 07 мая 2020

У меня есть таблица scylla, как показано ниже:

cqlsh:sampleks> describe table test;

CREATE TABLE test (
    client_id int,
    when timestamp,
    process_ids list<int>,
    md text,
    PRIMARY KEY (client_id, when) ) WITH CLUSTERING ORDER BY (when DESC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
    AND comment = ''
    AND compaction = {'class': 'TimeWindowCompactionStrategy', 'compaction_window_size': '1', 'compaction_window_unit': 'DAYS'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 172800
    AND max_index_interval = 1024
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

И я вижу, как мы запрашиваем ее. Я долгое время работал над cassandra, поэтому этот PER PARTITION LIMIT для меня в новинку (похоже, добавлен недавно). Может кто-нибудь объяснить, что это делает с некоторым примером на непрофессиональном языке? Я не смог найти ничего хорошего c в том, что легко объясняет.

SELECT * FROM test WHERE client_id IN ? PER PARTITION LIMIT 1;

1 Ответ

2 голосов
/ 07 мая 2020

Предложение PER PARTITION LIMIT может быть полезно в «сценарии широкого раздела». Он возвращает только первые две строки в разделе.

Возьмите этот запрос:

aploetz@cqlsh:stackoverflow> SELECT client_id,when,md 
        FROM test PER PARTITION LIMIT 2 ;

Учитывая определение PRIMARY KEY (client_id,when), этот запрос будет повторяться по каждой client_id. Затем Cassandra вернет только первые две строки (сгруппированные по when) из этого раздела, независимо от того, сколько вхождений when может присутствовать.

В этом случае я вставил 7 строк в ваш test таблица, используя два разных client_id s (всего 2 раздела). Используя PER PARTITION LIMIT из 2, я получаю 4 возвращаемых строки (2 client_id x PER PARTITION LIMIT 2) == 4 строки.

 client_id | when                            | md
-----------+---------------------------------+-----
         1 | 2020-05-06 12:00:00.000000+0000 | md1
         1 | 2020-05-05 22:00:00.000000+0000 | md1
         2 | 2020-05-06 19:00:00.000000+0000 | md2
         2 | 2020-05-06 01:00:00.000000+0000 | md2

(4 rows)
...