2017-01-12 15 views
0

与えられたタイムスタンプよりも古いテーブル要求からすべてのエントリを削除したい。与えられたタイムスタンプよりも古いタイムスタンプを持つCassandraテーブルエントリの削除

テーブル要求の構造:

Delete from Requests where request_timestamp < givenTimestamp; 

しかし、私は巨大なテーブルを持っている:主キーRE​​QUEST_IDを指定する必要があるため

CREATE TABLE requests (
    request_id uuid, 
    request_timestamp timestamp, 
    PRIMARY KEY (request_id, request_timestamp) 
) WITH CLUSTERING ORDER BY (request_timestamp ASC) 

は明らかに、クエリは動作しません。次何百万ものエントリがある場合、IN句のクエリを使用するのが最適ではありません。

Delete from Requests where request_id in (id1, id2.....) and request_timestamp < givenTimestamp; 

オプションは、TTL(Time to Live)を使用することですが、エントリを構成可能にするためにTTLを保持したいと考えています.TTLではこれは不可能です。

テーブルから古いエントリを削除するには他にどのような方法がありますか?

おかげ

答えて

1

主なものは、すでに書いたように、あなたは、このような削除を実行するには、パーティションキーを指定する必要があり、ということです。

タイムスタンプが毎日特定の日よりも短いすべてのリクエストを削除したい場合は、効率的にrequest_idの代わりにモデルとパーティションを変更することができます。ような何か:

CREATE TABLE requests (
    day timestamp, 
    request_id uuid, 
    request_timestamp timestamp, 
    PRIMARY KEY (day, request_timestamp, request_id) 
) WITH CLUSTERING ORDER BY (request_timestamp ASC, request_id ASC) 

フィールドdayだけコンポーネント(例えばyyyy-mm-dd)にrequest_timestamp切り捨てが移入されます。複数の期間から削除する必要がある場合は、1日1回の並列DELETEクエリを実行し、INは使用しないでください。また、セルレベルではなく、パーティションレベルでも削除します。これは読み込みに大きなプラスです。

関連する問題