2016-12-23 11 views
0
clausel

には、私は私のカサンドラクラスタで、次の時系列を持っている:のApache Cassandraの制限と

CREATE TABLE consumptions (
    meter_id int, 
    date date, 
    meter_date_time timestamp, 
    data text, 
    PRIMARY KEY ((meter_id, date), meter_date_time) 
) WITH CLUSTERING ORDER BY (meter_date_time DESC) 

iが月から最新の検針を必要とする月の消費を計算します。私の場合、クエリは次のようになります。

select * from consumtions 
where meter_id = 1 and 
date in (...'2016-12-30','2016-12-31'...) 
limit 1 

私は、複数のパーティションキーを持つIN句がアンチパターンであることを認識しています。非正規化がなければ、このクエリには良い方法がありますか?

他のほとんどのクエリでは、私はasnycクエリを使用しています - しかし、これはすべての結果を返し、私は限界を使用することはできません。

+0

ご意見ありがとうございます。 **もう1つの選択肢は、毎日1対1のクエリを非同期に実行し、アプリケーションレベルで最新のメジャーをフィルタリングすることです。それはちょっとしたコードです** – itstata

答えて

3

IN句は一般的に悪いですが、最大31日を置いているので、IMHOではパフォーマンスについて心配することなく保存できます。

もう1つの選択肢は、毎日1対1の照会を非同期で実行し、アプリケーションレベルで最新のメジャーを除外することです。それはほんの少しのコードです。

センサーがたくさんある場合は、直近の測定値をすぐに見つけることを望んでいる子孫の順序で日にちを照会することです。この方法では、アプリケーションレベルでの待ち時間を犠牲にして、より少ない数のクエリを実行し、クラスタから負荷を取り除くことができます。最後のメジャーが29日にある場合、31番目にクエリを実行し、ある日戻って30日にクエリを実行し、結果が見つからない場合は、1日前に戻り、29日をクエリして結果を見つけます。

+0

IN節は常に悪いです。 IN節を使用する代わりに、非同期照会を並列に実行する方が、クライアント上で処理するのではなく、コーディネーターに負荷をかけているためです。 1つのテーブルに時間バケットを格納して、それを解決すると、最新のデータがどこにあるかを常に知ることができます。 –

+0

私は同意しません。あなたのクラスタを叩いているなら、これは明らかに悪いことです。このクエリーをX日ごとに1回実行すると、何も破壊されません。さらに、OPはデータを非正規化せずにこれを実行する方法を尋ねたので、あなたの提案は満足できるものではありませんでした。 – xmas79

関連する問題