我在Cassandra 2.0.9中定义了下表:
CREATE TABLE history
(
histid uuid,
ddate text, -- Day Date, i.e. 2014-11-20
valtime timestamp, -- value time
val text, --value
PRIMARY KEY ((histid , ddate), valtime )
)
WITH CLUSTERING ORDER BY (valtime desc)
;
Run Code Online (Sandbox Code Playgroud)
脚本每天在此表中插入几千行。
我需要能够从该表中选择仅知道组别的信息。但是,我已经使用(histid,ddate)对行进行了分区。意思是,我每行都有一整天的历史记录值。
为了从该表中选择特定的组别,我还需要提供ddate列。例如:
SELECT * FROM history
WHERE histid= cebc4c80-daa6-11e3-bcc2-005056a975a4
AND ddate = '2014-05-16'
;
Run Code Online (Sandbox Code Playgroud)
要获取最新值,我可以执行以下操作:
SELECT * FROM history
WHERE histid= cebc4c80-daa6-11e3-bcc2-005056a975a4
AND ddate = '2014-05-16'
LIMIT 1
;
Run Code Online (Sandbox Code Playgroud)
但是,如果我要获取任何给定的组织ID的最新值,我将不知道ddate是什么就提交查询,因为它是分区键的一部分。
所以...我问,解决这个问题的最佳方法是什么?
这是我所做的,但是我不知道;这是否合理:
我创建了一个辅助表:
CREATE TABLE history_date
(
histid uuid,
maxdate timestamp, …Run Code Online (Sandbox Code Playgroud) 这是我的第一篇文章....
我有一个查询所花的时间比我想要的要长(不是我们所有人!)取决于我在WHERE子句中输入的内容……它可能运行得更快。我试图理解为什么查询计划与众不同,并且我可以做些什么来加快整个查询的速度。
这是查询1:
SELECT date_observed, base_value
FROM device_read_data
WHERE fk_device_rw_id IN
(SELECT fk_device_rw_id FROM equipment_set_rw
WHERE fk_equipment_set_id = CAST('ed151028-1fc0-11e3-b79f-47c0fd87d2b4' AS uuid))
AND date_observed
BETWEEN '2013-12-01 07:45:00+00'::timestamptz
AND '2014-01-01 07:59:59+00'::timestamptz
AND base_value ~ '[0-9]+(\.[0-9]+)?'
;
Run Code Online (Sandbox Code Playgroud)
"Hash Semi Join (cost=11.65..5640243.59 rows=92194 width=16) (actual time=34.947..132522.023 rows=43609 loops=1)"
" Hash Cond: (device_read_data.fk_device_rw_id = equipment_set_rw.fk_device_rw_id)"
" -> Seq Scan on device_read_data (cost=0.00..5449563.56 rows=72157042 width=32) (actual time=0.844..123760.331 rows=71764376 loops=1)"
" Filter: ((date_observed >= '2013-12-01 07:45:00+00'::timestamp with time zone) AND (date_observed <= '2014-01-01 07:59:59+00'::timestamp with …Run Code Online (Sandbox Code Playgroud)