cassandra中的ALLOW FILTERING,cassandrafiltering
cassandra中的ALLOW FILTERING
问题场景
刚开始使用cassandra的时候不熟悉cql的语法,将他当成sql操作。在使用cql进行查询操作的时候报错:
cassandra@cqlsh:tsp> select * from rt_basic where vin = 'LLXA2A300JA000616' and acc_pedal_stroke= 0 limit 5;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"
查看表结构:
cassandra@cqlsh:tsp> desc rt_basic;
CREATE TABLE tsp.rt_basic (
vin text,
trace_time timestamp,
acc_pedal_stroke double,
PRIMARY KEY (vin, trace_time)
) WITH CLUSTERING ORDER BY (trace_time DESC)
问题解析
根据错误反馈可知,Cassandra知道它可能无法以有效的方式执行查询。因此,它警告你:“小心点。像这样执行这个查询可能不是一个好主意,因为它可以使用大量的计算资源”。
问题解决
根据提示可知可在行尾加上ALLOW FILTERING来使语句符合语法:
cassandra@cqlsh:tsp> select * from rt_basic where acc_pedal_stroke= 0 limit 5 ALLOW FILTERING;
此举将从rt_basic表中检索所有行,然后过滤掉那些没有time1列所请求值的行。
适用场景分析
ALLOW FILTERING是一种非常消耗计算机资源的查询方式。
如果您的表包含例如100万行,并且其中95%具有满足查询条件的值,则查询仍然相对有效,您应该使用ALLOW FILTERING。
另一方面,如果您的表包含100万行,并且只有2行包含满足查询条件值,则查询效率极低。Cassandra将无需加载999,998行。如果经常使用查询,则最好在acc_pedal_stroke列上添加索引。
不幸的是,Cassandra无法区分上述两种情况,因为它们取决于表格的数据分布。因此,卡桑德拉会警告你并依靠你做出好的选择。
参考:ALLOW FILTERING explained
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。