问题描述
如果我在 Astra 中创建了一个表格,如下所示:
CREATE TABLE rayven.mytable (
a text,b text,c timestamp,PRIMARY KEY (a,c)
) WITH CLUSTERING ORDER BY (c DESC)
然后我添加了 SAI 索引:
CREATE CUSTOM INDEX b_index ON mytable (b) USING 'StorageAttachedindex';
当我使用 ORDER BY 查询时:
select * from mytable where b='x' order by c desc;
我明白了
InvalidRequest: Error from server: code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported."
由于原始表是按“c”降序排列的。是否可以假设上述 SELECT 的结果将按此顺序排列,或者在使用 SAI 索引进行选择时无法知道或控制顺序?
解决方法
为了帮助说明这一点,我创建了您的表格并插入了一些数据。然后,我在表中查询了 b
的值,并在此示例的分区键上包含了 token
函数。
注意:不是在 Astra 中运行,而是在我的本地 4.0 rc1 实例上运行。但是,原则保持不变。
基本上,所有结果集都按分区键的哈希标记值排序,然后每个分区内的 CLUSTERING ORDER
优先:
> SELECT a,token(a),c FROM mytable WHERE b='b';
a | system.token(a) | c
----+----------------------+---------------------------------
a4 | -9170418876698302957 | 2021-05-03 14:38:42.708000+0000
a5 | -925545907721365710 | 2021-05-03 14:39:06.849000+0000
a3 | -96725737913093993 | 2021-05-03 14:40:30.942000+0000
a3 | -96725737913093993 | 2021-05-03 14:39:18.340000+0000
a2 | 5060052373555595560 | 2021-05-03 14:40:30.938000+0000
a2 | 5060052373555595560 | 2021-05-03 14:39:14.914000+0000
a1 | 5693669818594506317 | 2021-05-03 14:38:54.426000+0000
a1 | 5693669818594506317 | 2021-05-03 14:38:52.758000+0000
(8 rows)
正如您在此处看到的,结果集不完全按 所以“不”,您不能指望数据自动完全按 c
排序。但最初按 a
的散列标记值排序,然后按 c
within 每个分区 (a
) 排序。
c
排序。