当前位置: 首页 > 知识库问答 >
问题:

使用maxPageSize和maxResultSize进行Dynamo Db查询,降低查询速度

宰子琪
2023-03-14

根据AWS文档,我正在使用dynamo db分页:

--

--

令人惊讶的是,当我不设置任何页面大小(1)时,DynamoDb查询速度明显更快,根据文档,情况应该不是这样。我假设dynamo db在默认情况下返回所有结果,如果我们不指定pageSize。

querySpec.withExclusiveStartKey(lastAccessedRecord); (1)


querySpec.withMaxPageSize(30);
            querySpec.withMaxResultSize(100);
querySpec.withExclusiveStartKey(lastAccessedRecord); (2)

共有2个答案

诸葛奇玮
2023-03-14

此问题的根本原因:ItemColletions也返回大小为0的页面。一旦有大小为0的页面,我们就需要打破循环,以避免在不必要的页面上进行迭代

ItemCollection使用某种延迟加载(仅当我们遍历页面时从DynamoDb获取结果)

“项的集合。ItemCollection对象维护指向其当前数据页的光标。最初,光标位于第一页之前。下一个方法将光标移动到下一行”

QuerySpec spec = new QuerySpec().withKeyConditionExpression("Id = :v_id")
            .withValueMap(new ValueMap().withString(":v_id", replyId)).withMaxPageSize(1);

        ItemCollection<QueryOutcome> items = table.query(spec);

        System.out.println("\nfindRepliesForAThreadSpecifyOptionalLimit results:");

        // Process each page of results
        int pageNum = 0;
        for (Page<Item, QueryOutcome> page : items.pages()) {

if(page.size==0)   ](fix )
break;             ]
            System.out.println("\nPage: " + ++pageNum);

            // Process each item on the current page
            Iterator<Item> item = page.iterator();
            while (item.hasNext()) {
                System.out.println(item.next().toJSONPretty());
            }
        }
    }
陈弘厚
2023-03-14

ItemCollection:它确实使用了延迟加载。AWS文件:

在此Iterable返回的迭代器上对{@code Iterator.next}的每次调用都会导致对DynamoDB的一次调用以检索单个结果页。

另一方面,DynamoDB中的分页基于包的大小(限制1MB大小)。返回的每个页面最大为1MB(项目数量会有所不同)。通过设置maxPageSize,DynamoDB将不得不进行更多的计算来满足您的请求,而不仅仅是根据包大小返回匹配的项目。

 类似资料:
  • 假设我有一个DynamoDB表: UserId是主键(hash),我需要将BookName设置为排序键(range),因为添加到数据库中的另一项用相同的UserId覆盖了前面的项。

  • 我对BigQuery中的集群表(带有日期分区)有一个问题。我有一个由名为entity_id的列集群的表。问题是,我希望在进行由这些集群列过滤的查询时看到字节读取减少,但根据BigQuery Web UI,它无论如何都在进行全扫描。 例如:<br>从<code>project.usersDataset中选择*。users_cluster其中entity_id='405849241'限制为1000 返

  • 使用DynamoDB,没有简单的方法可以对列执行索引范围查询。主键、本地二级索引和全局二级索引都需要分区键来进行范围查询。 例如,假设我有一个带有数字分数属性的高分表。使用索引范围查询无法获得前10名或前25至50名 那么,执行这项极其常见的任务的惯用方式或首选方式是什么呢? > 接受表格扫描。 使用静态分区键并利用分区查询。 使用固定数量的静态分区键并使用多个分区查询。

  • 我对DynamoDB非常陌生(一般没有Sql),在理解如何形成一个简单的查询时遇到了一些困难。。 我想在SQL中执行一个简单的选择,但似乎无法完成。 我的表定义基本上是: 表名snsNotiations主分区密钥接收者ID(编号) 它遵循一些属性(如readAt)。 我要执行的查询是: 我甚至可以在AWS UI上执行此查询:截图 我的lambda函数使用以下内容: 但我得到以下错误: 无法查询。错

  • 我正在寻找优化Dynamodb操作,即删除扫描和使用查询快速获取数据。 表数据: 我必须使用项目名称进行项目搜索。现在,我们扫描整张桌子。 然后,如果itemOwners包含搜索用户的用户ID,我们将过滤items结果。 我想知道是否有更好的方法使用dynamodb进行搜索查询?

  • 我有一个带有哈希键(id)的表(配置文件),我有一个关于名称的GSI,一个关于国家的范围键。我想创建一个DAO方法,它将获取所有具有给定值的name和country的记录,如下所示:List getProfileWithNameAndCountry(name,country);