保存少量数据比在CassandraDB中保存大量数据要慢

时间:2017-03-23 16:41:51

标签: c# cassandra

我有这个奇怪的问题 - 给出以下两个模型:

[Table(Name = "pretty_fast_table", Keyspace = "funky_stuff")]
internal class PrettyFastTable
{
    [Column(name: "message_number")]
    [PartitionKey]
    public long MessageNumber { get; set; }

    [Column(name: "time_stamp")]
    [ClusteringKey]
    public DateTime TimeStamp { get; set; }

    [Column(name: "some_value")]
    public decimal SomeValue { get; set; }

    [Column(name: "is_a_cool_entry")]
    public bool IsACoolEntry { get; set; }
}

[Table(Name = "pretty_slow_table", Keyspace = "funky_stuff")]
internal class PrettySlowTable
{
    [Column(name: "message_number")]
    [PartitionKey]
    public long MessageNumber { get; set; }

    [Column(name: "some_other_value")]
    [ClusteringKey]
    public decimal SomeOtherValue { get; set; }

    [Column(name: "some_other_other_value")]
    public decimal? SomeOtherOtherValue { get; set; }

    [Column(name: "percentage")]
    public decimal Percentage { get; set; }

    [Column(name: "count")]
    public int Count { get; set; }

    [Column(name: "my_value")]
    public decimal MyValue { get; set; }
}

将50万个条目写入PrettyFastTable需要< 1分钟。将50万个条目写入PrettySlowTable经常拍摄的> 8分钟。我用来写两种类型的条目的代码如下:

public async Task ExecuteAsync(IEnumerable<T> partition, long partitionKey)
{
    var entitiesArr = partition.ToArray();

    var size = calculatedBatchSize;
    var groups = entitiesArr
        .Select((item, idx) => new {item, idx})
        .GroupBy(x => x.idx / BatchSize)
        .Select(g => g.Select(x => x.item));

    await BatchInsertAsync(groups, partitionKey);

    break;
}

private async Task BatchInsertAsync(IEnumerable<IEnumerable<T>> groups, long partitionKey)
{
    foreach (var group in groups)
    {
        var batch = new BatchStatement();
        var groupArr = group.ToArray();

        batch.SetBatchType(BatchType.Unlogged);
        batch.SetRoutingValues(partitionKey);

        foreach (var entry in groupArr)
        {
            batch.Add(_table.Insert(entry, false).SetTTL(TTL));
        }

        await _session.ExecuteAsync(batch);
    }
}

唯一的区别是IEnumerable<PrettyFastTable>分区通常比另一个分区大得多。我不明白 - 为什么这么慢?

我的Cassandra集群由3个节点组成,对于配置内容,它基本上是默认节点。

1 个答案:

答案 0 :(得分:0)

不应将批次用于批量装载。

来自"Using and Misusing Matches" documentation

  

经常错误地使用批次来尝试优化性能。未记录的批处理需要协调程序来管理插入,这会对协调程序节点造成沉重的负担。如果其他节点拥有分区密钥,则协调器节点需要处理网络跃点,导致传送效率低下。在对同一分区键进行更新时使用未记录的批次。

有关详细信息,请参阅DataStax C# driver FAQ

Batch loading without the BATCH keyword还有一篇很好的文章。