【问题标题】:select * vs select specific columns in Cassandra选择 * 与选择 Cassandra 中的特定列
【发布时间】:2018-03-17 05:47:05
【问题描述】:

在 RDBMS 中,通常建议根据供应商选择特定的列,但是 Cassandra 呢?

从表中选择 *; 对比 从表中选择名称;

请记住,您可能有 50 列(仅作为示例)。

【问题讨论】:

    标签: database cassandra cql


    【解决方案1】:

    在某些情况下它可以提供一点帮助,但在大多数情况下它只是一个很小的改进。我建议您使用基准测试您的案例。

    仅仅select * 与 Cassandra 并没有什么大不了的。如果您不将所有内容传输到客户端,这将意味着更少的序列化/反序列化。尤其是在您拥有大量列(例如 50 个)的情况下。数据的布局方式可能会读取所有列以从磁盘中提取行。与调整分区大小、最小化墓碑、系统/堆设置或正确使用压缩策略等内容相比,它的优化更小。

    【讨论】:

    • 你确定its likely gonna read all of columns anyway to pull the row from disk 吗?你能提供一些参考来支持吗?我确信 SSTable 是按键和列索引的,并且希望对特定列的查询只会从磁盘中获取这些列。对不对?
    • sstable 索引标志着 sstable 中每个分区的开始。在读取时,它将对该索引文件的摘要进行二进制搜索(每 X 个分区,X 是动态的)。它将从最近的摘要中扫描索引文件,直到找到要开始的分区,然后在数据文件中查找(可能的压缩元数据转换)。从那里它开始根据读取类型读取分区。这在较旧的引擎与当前的 3.0 引擎中有所不同 - 但是每个(可配置的)字节都会采用一个 RowIndex 进行排序。所以它可以通过二分查找找到最近的块并进行扫描。
    • 获取 RowIndex 位置可以在github.com/apache/cassandra/blob/… 看到 - 在缓存未命中和更大的数据集上,这可能会主导您的读取成本。但是从那里github.com/apache/cassandra/blob/… 更多的是过滤掉未获取的列,因为必须反序列化以推进迭代器。
    • 不确定我是否在关注你。据我了解, RowIndexEntry 仅包含索引数据(而不是实际数据),然后获取所需的列。那么为什么你说所有的列都被提取了呢?另外,请查看issues.apache.org/jira/browse/CASSANDRA-10657 - 似乎总是获取所有列存在问题,但在 3.4 中已解决。
    • 正如我所说,我建议对您的用例进行基准测试,看看影响有多大。有一些数据模型可以提供更多帮助或无法估量。即使使用 CASSANDRA-10655,默认情况下,RowIndex 也是匹配集群键 +- 64kb 的开头,而不是特定单元格。从该点开始的每个单元格都由迭代器遍历,列过滤器包含的只是允许序列化助手跳过内容而不是完全反序列化它们(这取决于单元格类型可能与读取成本无关)。跨度>
    猜你喜欢
    • 2014-01-04
    • 2015-12-19
    • 1970-01-01
    • 2011-02-27
    • 2011-03-11
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多