2017-10-05 7 views
0

によって選択:私は頻繁にレコードを更新していますカサンドラスキーマ - テーブルを考えると、頻繁に更新された列

CREATE TABLE T (
     a int, 
     last_modification_time timestamp, 
     b int, 
    PRIMARY KEY (a) 
); 

を。各更新でlast_modification_timenow()に設定され、他のフィールドも設定されます。

last_modification_timeの範囲でクエリできるようにするには、適切なキャッサンドラアプローチは何ですか?

  • select * from .. where a=Z and last_modification_time < X and last_modification_time > Y;

一つの方法は、作成することですPRIMARY KEY (a, last_modification_time)でのマテリアライズド・ビューが、私はは、マテリアライズド・ビューをするので、これを回避したい3.Xのカサンドラのバージョンでバギーです:私はこのようなクエリを実行する必要があります。

last_modification_timeのクエリの代替方法は何ですか?last_modification_timeは頻繁に更新されますか?

+0

あなたのスキーマが広い行になります...あなたができない場合データモデルを変更し、常にセカンダリインデックスを使用するパーティションキーを使用します... https://stackoverflow.com/questions/35719985/range-query-on-secondary-index-in-cassandra –

+0

@undefined_variableあなたは「ワイド行」の意味ですか? –

+0

あなたの最善の選択肢は、おそらくこのようなクエリモデルをサポートするためにPostgresを使用することです。 – Aaron

答えて

0

2つのテーブルはありますか? last_modification_timeフィールドを更新している現在のスナップショットと、変更履歴を保持する別のスナップショット(履歴テーブルなど)を保持できますか? BATCHステートメントを使用して、両方に書き込むことができます。

CREATE TABLE t_modifications (
     a int, 
     last_modification_time timestamp, 
     b int, 
    PRIMARY KEY (a, last_modification_time) 
) WITH CLUSTERING ORDER BY (last_modificaton_time DESC); 

BEGIN BATCH 
     UPDATE T SET last_modification_time = 123, b = 4 WHERE a = 2; 
     INSERT INTO t_modifications (a, last_modification_time, b) values (2, 123, 4); 
APPLY BATCH; 

あなたが与えられた変更の範囲により、最新のスナップショットに興味があるなら、あなたが選択しt_modificationsテーブルを制限することができます。

SELECT * FROM t_modifications WHERE a = 2 AND last_modification_time < 136 LIMIT 1; 
関連する問題