0

我在 DDB 中存储了大约 780K(计数)个项目。

我正在调用 DynamoDBMapper.query(...) 方法来获取所有这些。结果很好,我可以得到所有的项目。但我花了 3 分钟才拿到它们。

从日志中,我看到 DynamoDBMapper.query(...) 方法正在尝试逐页获取项目,每个页面将请求对 DDB 的单独查询调用,每页大约需要 0.7 秒。我统计了所有返回的项目有 292 页,所以总时长约为 0.7*292=200s,这是不可接受的。我的代码基本上如下:

    // setup query condition, after filter the items count would be about 780K
    DynamoDBQueryExpression<VendorAsinItem> expression = buildFilterExpression(filters, expression); 

    List<VendorAsinItem> results = new ArrayList<>();
    try {
        log.info("yrena:Start query");
        DynamoDBMapperConfig config = getTableNameConfig();
        results = getDynamoDBMapper().query( // get DynamoDBMapper instance and call query method
                VendorAsinItem.class,
                expression,
                config);
    } catch (Exception e) {
        log.error("yrena:Error ", e);
    }
    log.info("yrena:End query. Size:" + results.size());

那么如何在不分页的情况下一次获取所有项目。我的最终目标是减少查询持续时间。

4

1 回答 1

0

编辑刚刚重新阅读问题的标题并意识到也许我没有直接解决问题:由于每页 1MB 的硬限制,没有分页就无法检索 780,000 个项目


长格式答案

在 3 分钟内检索了 780,000 个项目,使用 292 页:大约每秒 1.62 页。

花点时间,让它同步..

Dynamo 每页可以返回 1MB 的数据,因此您可能每秒传输 1.5MB 的数据(这将使 10 Mbit 管道饱和)。

没有关于 (a) 检索到的项目的实际大小的进一步细节;(b) 您的互联网连接带宽;(c) 可能从查询结果中过滤掉的项目数和 (d) 我将开始查看的表上的预置读取容量:

  1. 您的客户端和 Dynamo/AWS 之间的网络带宽是多少——如果您没有将其最大化,则继续下一步;

  2. 表上配置了多少读取容量(如果您看到请求有任何限制,您可以增加表上的 RCU 以提高速度,但需要支付金钱费用)

  3. 您的查询效率:

  • 如果您正在应用过滤器,请知道这些过滤器是在生成查询结果后应用的,因此查询会消耗 RCU 来处理被过滤掉的内容,这也意味着查询效率低下

  • 考虑是否有方法可以优化查询以访问更少的数据

最后 780,000 个项目对于查询来说是很多 - 数据库中项目的百分比是多少?

您能否创建一个二级索引,该索引基本上包含大部分或所有数据,然后您可以简单地扫描而不是查询?

与查询不同,扫描可以并行化,因此如果您的网络带宽、内存和本地计算足够大,并且您愿意在数据库上配置足够的容量,您可以读取 780,000 个项目,速度明显快于查询。

于 2021-01-28T01:03:11.713 回答