我一直在为一个列族建模。截至目前,主要关键是 主键((side,rundate),基金)。所以我正在执行以下查询
select count(*) from cf_Summary
where side = 'Long'and rundate in ('2015-01-12 05:30:00','2015-01-13 05:30:00');
上面的查询返回1200.如果我在查询下运行,则返回0记录。
select count(*) from cf_Summary
where token(side,rundate)>= token('Long','2015-01-12 05:30:00') and token(side,rundate) <= token('Long','2015-01-13 05:30:00');
令牌运算符可以应用于最后两个分区列,如datastax网站中所述。 http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause
为什么我在第二个查询中得到0计数。 Side有两个Long和Short值,所以我想在某个时间长时间执行查询,有时在短时间内执行查询,有时在日期范围内执行两个值。在第一个查询中,我可以限制rundate,但可以查询long和shot。我知道两个行键都存储在不同的行上。
是否可以执行
select count(*) from cf_valuationsummary_1
where token(side,rundate)>= token('Long','2015-01-02 05:30:00') and token(side,rundate) <= token('Short','2015-01-03 05:30:00');
协调器节点可以查询两个节点以获取数据,但我想从客户端应用程序执行单个查询,尽管存在性能问题
任何领先?
答案 0 :(得分:0)
看起来您在两个查询中使用了不同的日期字符串。
在使用IN子句的第一个查询中,您使用了日期01-12和01-13。
但是在令牌查询中,您使用的是日期01-02和01-03。
所以也许你没有01-02和01-03的任何行。
除此之外,令牌查询看起来有效。
更新
我做了一些实验。我认为这种类型的查询可能只适用于ByteOrderedPartitioner。使用Murmur3Partitioner时,日期字符串不会对给定分区键的标记值进行排序。例如,使用此数据:
cqlsh:试验&gt; select * from cf_Summary;
side | rundate | fund
-------+---------------------+------
Short | 2015-01-13 05:30:00 | HIJ
Long | 2015-01-12 05:30:00 | ABC
Long | 2015-01-13 05:30:00 | DEF
Short | 2015-01-12 05:30:00 | HIJ
我们得到这样的令牌值:
cqlsh:试验&gt;从cf_Summary中选择标记(side,rundate);
token(side, rundate)
----------------------
-2522183250639624078
-2064350486281951596
1812183325578390943
7832903641319907586
因此,您可以看到具有较高日期的短行具有负标记值,而较早的短日期具有正标记值。因此,如果我对这些令牌值进行范围查询,则会找到零行。对于长行,它发生了早期日期的标记值为负,后一日期为正,因此找到两个长行。
cqlsh:试验&gt;从cf_Summary中选择count(*),其中token(side,rundate)&gt; = token('Short','2015-01-12 05:30:00')和token(side,rundate)&lt; = token('Short ','2015-01-13 05:30:00');
0
cqlsh:试验&gt;从cf_Summary中选择count(*),其中token(side,rundate)&gt; = token('Long','2015-01-12 05:30:00')和token(side,rundate)&lt; = token('Long ','2015-01-13 05:30:00');
2
所以一般来说,我不认为你要做的事情会起作用,因为令牌值与你日益增加的日期并不直接相关。