如何使查询工作?
Posted
技术标签:
【中文标题】如何使查询工作?【英文标题】:How to make the query to work? 【发布时间】:2016-04-21 21:54:51 【问题描述】:我有 Cassandra 2.0 版,在其中我是全新的,所以问题...
我有表T1
,列的名称为:1,2,3...14(为简单起见);
Partitioning key
是列 1
, 2
;
Clustering key
是列 3
,1
,5
;
我需要执行以下查询:
SELECT 1,2,7 FROM T1 where 2='A';
2
列是一个标志,因此值是重复的。
我收到以下错误:
Unable to execute CQL query: Partitioning column 2 cannot be restricted because the preceding column 1 is either not restricted or is restricted by a non-EQ relation
那么正确的方法是什么?我真的需要得到已经过滤的数据。谢谢。
【问题讨论】:
【参考方案1】:所以,为了确保我理解您的架构,您已经定义了一个表 T1
:
CREATE TABLE T1 (
1 INT,
2 INT,
3 INT,
...
14 INT,
PRIMARY ((1, 2), 3, 1, 5)
);
正确吗?
如果是这种情况,那么 Cassandra 无法找到数据来回答您的 CQL 查询:
SELECT 1,2,7 FROM T1 where 2 = 'A';
因为您的查询没有为列“1”提供值,没有该值,Cassandra 无法计算分区键(根据您的复合 PRIMARY KEY
定义,这需要列“1”和 “2”),没有它,它无法确定在哪里查看环中的哪些节点。通过在您的分区键中包含“2”,您是在告诉 Cassandra 该数据是必需用于确定存储位置(因此,读取位置 em>) 该数据。
例如,给定您的架构,这个查询应该工作:
SELECT 7 FROM T1 WHERE 1 = 'X' AND 2 = 'A';
因为您提供了分区键的两个值。
@Caleb Rockcliffe 有很好的建议,不过,如果上面的表定义是您工作量的很大一部分,则需要其他辅助/补充查找机制。您可能需要找到一些方法来首先查找“1”和“2”的值,然后发出您的查询。 例如:
CREATE TABLE T1_index (
1 INT,
2 INT,
PRIMARY KEY (1, 2);
);
给定“1”的值,上面将提供所有可能的“2”值,然后您可以通过这些值进行迭代:
SELECT 2 FROM T1_index WHERE 1 = 'X';
然后,对于每个“1”和“2”组合,您可以然后针对表 T1
发出查询:
SELECT 7 FROM T1 WHERE 1 = 'X' AND 2 = 'A';
希望这会有所帮助!
【讨论】:
这很有帮助,谢谢。那么这是否意味着对于 T1_index 我每次插入 T1 时都需要单独插入? 是的,很遗憾。 Cassandra 喜欢“非规范化”,这实际上意味着重复。而且它不支持外键约束或类似的东西,因此您的应用程序代码需要知道写入(多个)相关表并从中读取。 我只是花了一些时间在我的架构中尝试这个和那个,似乎我根据你所展示的内容找到了我的任务的解决方案。所以我们可以说,对于每个特定的选择查询,我需要创建一个单独的表,并将该表包含在我的代码中插入批处理中,只要这些插入可以忽略不计,这很好,对吧?所以 Cassandra 适合大量读取和偶尔的插入或更新,对吧?同样,我是新来的,完全是 RDBMS 家伙)Cassandra 内部是否有任何机制来保持所有表的更新,而不是在我的代码中进行多次插入? 实际上,Cassandra 针对写入进行了优化; reads 是昂贵的。这就是非规范化/复制有用的原因;它有助于改善 Cassandra 读取延迟。不,据我所知,Cassandra 没有内置任何东西来自动更新基于单个写入/插入的“相关”表。 Cassandra 的速度和扩展能力的很大一部分来自于没有具有由数据库强制执行的那种模式关系;这些关系被视为“业务”或“应用程序”逻辑,并留给您的应用程序处理。【参考方案2】:您的WHERE
子句需要包含分区键的第一个元素。
【讨论】:
是的,这正是错误所说的。但是如何以正确的方式获得我需要的东西? 如果您没有任何数据建模灵活性,并且需要跨分区切割,您可能需要考虑索引策略。在 vanilla Cassandra 2.0 中,这可能意味着使用二级索引,但有许多潜在的性能缺陷需要注意。如果此查询是您读取工作量的很大一部分,您可能需要考虑对数据进行建模,以便您限制的键是主键的前缀。以上是关于如何使查询工作?的主要内容,如果未能解决你的问题,请参考以下文章
在 Access 中使用多个组合框作为查询条件不能一起使用,但使用一个组合框可以吗?如何使所有组合框工作?
Laravel 8 - MS SQL - 查询生成器 - 使用 DB Raw。尝试使代码正确,使其像工作的 MSSQL 代码一样工作