- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 Scylla(Cassandra 兼容数据库)中有一个表定义如下:
create table s.items (time timeuuid, name text, primary key (time));
我想运行一个在特定时间后获取所有项目的查询,类似于以下内容:
select * from s.items where time>7e204790-43bf-11e9-9759-000000000004 order by time asc;
但有人告诉我,ORDER BY 仅在分区键受 EQ 或 IN 限制时才受支持。
为了解决这个问题,我可以创建一个类似于以下内容的表和查询:
create table s.items (yes boolean, time timeuuid, name text, primary key (yes, time));
select * from s.items where yes=true and time>7e204790-43bf-11e9-9759-000000000004 order by time asc;
虽然这可行,但它似乎不是最佳解决方案。由于我对 Scylla 和 CQL 还很陌生,有没有更好/正确的方法来做到这一点?
最佳答案
您添加一个 bool 键并始终将其设置为"is"的解决方案基本上会创建一个包含所有数据的巨大分区。这很少是您真正想要的。如果这个分区是你的全部数据,这意味着即使你有一个 10 节点的集群,每个节点上有 8 个 CPU,集群中所有 80 个 CPU 中只有 3 个 CPU 会做任何工作(因为每个分区属于一个某些 CPU,并且 RF=3 时有三个副本)。
如果您想知道为什么您的原始解决方案不起作用并且 Scylla 拒绝了“ORDER BY”,那么问题是尽管 Scylla 可以扫描整个表以查找时间 X 之后的条目(您需要向查询添加“ALLOW FILTERING”),它没有有效的方法来按时间排序它找到的内容。在内部,不同的分区不是按分区键排序的,而是按“ token ”排序的,分区键的哈希函数。这种具有随机化效果的散列对于平衡集群上所有 CPU 之间的负载很重要,但会阻止 Scylla(或 Cassandra)以原始键顺序读取分区。
您可以做的一件事是按照 Alex 上面的建议,这是您的原始设置和建议的解决方案之间的中间地带:不要每个分区有一个项目,或者所有项目都在一个分区中,但是中间的东西:例如,假设在您的工作负载中,您每天收集 100MB 的数据。所以你使用天数作为分区键(而不是你的 bool)。某一天的所有数据都将位于一个分区中。 在每一天的分区中,不同的条目(行)将按集群键顺序排序,这将是时间。使用此设置,要在特定日期之后检索所有项目,只需开始逐日查询即可。例如,查询第 134 天,然后是第 135 天,然后是第 136 天,然后……在每一天中,结果都已经排序。这样问题就解决了。
这种技术是一种相当著名的“时间序列”数据建模。 Scylla(和 Cassandra)甚至有一个针对此建模调整的特殊压缩策略,TWCS(时间窗口压缩策略)。
关于database - Cassandra:如何在没有EQ或IN限制的PRIMARY KEY的情况下使用 'ORDER BY'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55095992/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!