【问题标题】:DynamoDBMapper load vs queryDynamoDBMapper 负载与查询
【发布时间】:2015-08-06 07:59:38
【问题描述】:

DynamoDBMapper 提供了从表中读取一项的不同方法:

  • 查询
  • 加载

是否有推荐,使用哪一个?在快速测试中,以下两个代码 sn-ps 为具有主键=哈希和范围键=日期的表返回相同的“MyEntry”项,而查询方法大约快 10%。

加载

public MyEntry getEntryForDay(final Integer hash, final LocalDate date) {
    return mapper.load(MyEntry.class, hash, date);
}

查询

public MyEntry getEntryForDay(final Integer hash, final LocalDate date) {
    final MyEntry hashKeyValues = new MyEntry ();
    hashKeyValues.setHash(hash);
    final Condition rangeKeyCondition = new Condition()//
            .withComparisonOperator(ComparisonOperator.EQ.toString())//
            .withAttributeValueList(new AttributeValue().withS(new LocalDateMarshaller().marshall(date)));
    final DynamoDBQueryExpression<MyEntry> queryExpression = new DynamoDBQueryExpression<MyEntry>()//
            .withHashKeyValues(hashKeyValues)//
            .withRangeKeyCondition("date", rangeKeyCondition)//
            .withLimit(1);
    final List<MyEntry> storedEntries = mapper
            .query(MyEntry.class, queryExpression);
    if (storedEntries.size() == 0) {
        return null;
    }
    return storedEntries.get(0);
}

【问题讨论】:

  • “大约快 10%”。你是如何对这些进行基准测试的?你的尺寸是多少?
  • 我没有正确地进行基准测试,只是做了一个时间测量。使用 mapper.load 插入样本表需要 90 毫秒,使用 mapper.query 插入同一张表需要 110 毫秒。

标签: amazon-dynamodb


【解决方案1】:

加载和查询是不同的操作:

如果您有一个只有哈希键的架构,它们会执行相同的操作 - 使用指定的哈希键检索项目。

如果您有哈希范围架构,则 load 检索由单个哈希 + 范围对标识的特定项目。查询检索所有具有指定哈希键且满足范围键条件的项目。

由于您对哈希键和范围键都使用相等运算符,因此操作完全相同。

【讨论】:

    【解决方案2】:

    好的,现在随着我越来越习惯使用 DynamoDB,结果证明 mapper.query 代码中的错误导致性能下降:

    • “withLimit(1)”实际上并不限制列表中返回的总结果,而是在“PaginatedQueryList”中返回结果,如果访问实际项目,则延迟从 DB 加载。 WithLimit(1) 实际上限制了每个请求加载的项目。
    • 实际的错误是“if (storedEntries.size() == 0)”部分,因为 size() 调用实际上加载了列表中的所有项目。使用 withLimit(1) 会导致性能最差。

    映射器查询的正确代码是:

    public MyEntry getEntryForDay(final Integer hash, final LocalDate date) {
        final MyEntry hashKeyValues = new MyEntry ();
        hashKeyValues.setHash(hash);
        final Condition rangeKeyCondition = new Condition()//
                .withComparisonOperator(ComparisonOperator.EQ.toString())//
                .withAttributeValueList(new AttributeValue().withS(new LocalDateMarshaller().marshall(date)));
        final DynamoDBQueryExpression<MyEntry> queryExpression = new DynamoDBQueryExpression<MyEntry>()//
                .withHashKeyValues(hashKeyValues)//
                .withRangeKeyCondition("date", rangeKeyCondition)//
                .withLimit(1);
        final List<MyEntry> storedEntries = mapper
                .query(MyEntry.class, queryExpression);
        if (storedEntries.isEmpty()) {
            return null;
        }
        return storedEntries.get(0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-11
      • 2018-09-20
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多