Hi Sebastien,

It's a bit more complicated than that.

To begin with, the first-class citizen in Cassandra is partition, not row. All map fields in the same row are in the same partition, and all rows with the same partition key but different clustering keys are also in the same partition. During a compaction, Cassandra does its best not to split a partition into multiple SSTables, unless it must, e.g. when dealing with repaired vs unrepaired data. That means regardless it's a map field in a row or multiple rows within same partition, they get compacted into the same number of SSTables.

A map type field's data may live in one column, but definitely not just one blob of data from the server's perspective, unless it's frozen. Reading such data is no cheaper than reading multiple columns and rows within the same partition, as each components of it, a key or a value, needs to be deserialised individually from the on-disk SSTable format, and then serialised again for the network protocol (often called the native protocol, NTP, or binary protocol) when it is read by a CQL client.

There's no obvious performance benefit for reading key-value pairs from a map field in a row vs columns and rows in the same partition. However, each row can be read separately and selectively, but key-value pairs in a map cannot. All data in a map field must be fetched all at once. So if you ever need to selectively read the data, reading multiple columns and rows in the same partition filtered by clustering keys will actually perform better than reading all key-value pairs from a large map type field and then discarding the unwanted data.

If you really want better server-side read performance and always read the whole thing, you should consider use a frozen map or frozen UDT instead. Of course, there's a cost to freeze them. A frozen data cannot be partially modified (e.g. add, remove or update a value in it), it can only be deleted or overwritten with new data at once. Which means it may not be suitable for your use case.

I can see you also mentioned big partitions. Large partitions in Cassandra usually is a bad idea, regardless it's a single row with a few columns or many rows with many columns. There's some exceptions that may work well, but generally you should avoid creating large partitions if possible. The problem with large partitions is usually the JVM heap and GC pauses, rarely CPU or disk resources.

Regards,
Bowen


On 18/12/2023 17:00, Sébastien Rebecchi wrote:
Hello

If i have a colum of type Map, then with many insertions, the map grows, but after compation, as the full map is 1 column of a table, will it be contained fully in 1 SSTable?
I guess yes cause the map is contained in a single row. Am I right?
Versus if we use a clustering key + a standard column instead of a map, insertions will create many rows, 1 per clustering key value, so even after compaction the partition could be splitted in several SSTables. Can you tell me if i understood correctly please? Because if it is right then it means the pb of big partitions can be enhanced using Map as it will induce much more CPU and disk resources to perform compaction (on the other hand you will have lower read amplification factor with map).

Thanks,

Sébastien

Reply via email to