2016-12-23 6 views
0
clausel

에 내가 내 카산드라 클러스터에 다음과 같은 시계열이 있습니다아파치 카산드라 제한 및

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) 

내가 한 달에서 최신 검침을 필요로 한 달의 소비를 계산합니다. 내 경우 쿼리는 다음과 같습니다

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

나는 여러 파티션 키 IN 절은 안티 패턴이라고 알고 있어요. 비정규 화하지 않고이 쿼리에 더 좋은 방법이 있습니까?

다른 대부분의 쿼리에서 나는 asnyc 쿼리를 사용하고 있습니다.하지만이 쿼리는 모든 결과를 반환 할 것이므로 제한을 사용할 수 없습니다.

+0

의견을 보내 주셔서 감사합니다. ** 두 번째 대안은 일별 일별 쿼리를 비동기로 실행하고 응용 프로그램 수준에서 가장 최근의 측정 값을 필터링하는 것입니다. ** – itstata

답변

3

IN 절은 일반적으로 좋지 않지만 31 일 정도를두고 있기 때문에 공연에 대해 걱정하지 않아도됩니다.

두 번째 방법은 매일 한 달에 한 번씩 쿼리를 비동기 적으로 실행하고 응용 프로그램 수준에서 가장 최근의 측정 값을 필터링하는 것입니다. 그것은 단지 약간의 코드입니다.

세 번째 대안은 많은 센서가있는 경우 곧 마지막 측정 값을 찾기 위해 자손 순서로 날짜를 쿼리하는 것입니다. 이 방법을 사용하면 응용 프로그램 수준에서 약간의 지연이 발생하지만 클러스터에서 일부로드를 제거하여 더 적은 수의 쿼리를 실행할 수 있습니다. 마지막 측정 값이 29 일이면 31 번째 쿼리를 실행하고 결과를 찾을 수 없으므로, 언젠가 돌아가서 30 번째 질문을하고 결과가 없다면 언젠가 돌아가서 29 번째 질문을하고 결과를 찾으십시오.

+0

IN 절은 항상 잘못되었습니다. IN 절을 사용하는 대신 비동기 쿼리를 병렬로 실행하는 것이 클라이언트에서 처리하는 대신 코디네이터에 스트레스를주고 있기 때문에 더 좋습니다. 하나의 테이블에 시간 버킷을 저장하여 문제를 해결 한 다음 항상 최신 데이터가 어디에 있는지 파악할 수 있습니다. –

+0

동의하지 않습니다. 당신이 당신의 클러스터를 망치로 치고 있다면 이것은 분명히 나쁘다. X 일마다 한 번씩이 쿼리를 실행하면 아무 것도 깨지지 않습니다. 또한 OP는 데이터를 비정규 화하지 않고이를 수행하는 방법을 물었습니다. 따라서 제안은 만족스럽지 않을 수 있습니다. – xmas79