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

这是Azure CosmosDB中高效的结构/查询吗?

宇文鸣
2023-03-14

我正在我的应用程序中为我的用户添加简单的搜索功能,我强烈考虑使用Azure CosmosDB。my Cosmos数据库(Azure)中的文档表示电话,如下所示:

{
    "id": "JKEeW3aebSEAzUA",
    "partitionKey": "191625028",
    "ownerId": "191625028",
    "callTime": "2020-06-12T22:13:18.271+00:00",
    "direction": "Inbound",
    "action": "Phone Call",
    "result": "Accepted",
    "callers": [
        {
            "phoneNum": "9182914018",
            "name": "JENKS        OK",
            "location": "Jenks, OK"
        },
        {
            "phoneNum": "9189406524",
            "name": "Main IVR",
            "location": null
        },
        {
            "phoneNum": null,
            "name": "Main IVR",
            "location": null,
        }
    ]
}

我将根据每个调用者项中的嵌套属性phoneNumname位置提供搜索能力。我正在考虑使用此查询:

SELECT c.id,a.phoneNum,c.callers 
FROM c join a in c.callers 
where CONTAINS(a.phoneNum, '4018')

这是执行此类搜索的最有效方法吗?我愿意重组我的文档,以加快在这些字段中的搜索。需要注意的一些事项:

  1. 这是一个多租户系统,我们在此特定数据库中使用“每个租户分区”方案。
  2. 当数据导入完成时,某些分区/租户将具有 1,000,000 条呼叫记录和 3,000,000 - 4,000,000 个嵌套调用方记录。

我是Azure CosmosDB的新手。目前,我们通过SQL服务器提供与此类似的有限搜索功能。此结构与SQL服务器中的结构(父呼叫记录、子呼叫记录)相同。

共有2个答案

羊越
2023-03-14

这是一个多租户系统,我们使用的是“每个租户分区”...这是执行这种搜索的最有效方式吗?

如果不筛选到单个分区键,则将在每个物理分区上运行查询。

Cosmos DB物理分区更像一个独立的SQL Server,而不像一个SQL Server表分区。

在多租户系统中,大多数查询的作用域应为单个租户。看见

https://docs . Microsoft . com/en-us/azure/cosmos-db/how-to-query-container # in-partition-query

除此之外,请确保您没有从索引策略中排除该属性路径,并且它应该是合理的。您可以随时在门户或代码结果中检查查询所消耗的请求单元。在Cosmos DB中,你需要时刻关注这一点,因为它会直接转化为金钱。

您可以在数据库中的所有容器之间共享配置的请求单元,如果您使用每个租户的容器模型,则可以选择其他一些有用的分区键,以优化租户内的访问。

商和颂
2023-03-14

我认为一个优化的解决方案是每个租户有多个容器。这也将解决每个租户的数据隔离问题。

除此之外,您的分区键可以基于一个或多个数据字段的部分或组合,这样,容器中的数据集数量几乎均匀分布在所有分区中。

 类似资料:
  • 问题内容: 在SQL中,“结构化”一词是什么意思? 是否因为此(SQL)语言语句被组织为子句,表达式和谓词? 由于这个组织,它被称为“结构化”吗? 问题答案: 最初的全名是SEQUEL,代表“结构化英语查询语言”。由于商标问题,后来不得不将其重命名为SQL。 因此,基本上,这是将编程语言出售为“就像英语一样,除了具有正式语法外”的另一种尝试(因此称为“结构化”)。

  • 直接上 codepen demo codepen 我希望能查询 container 元素的高度,高度超出指定高度后改变背景色但是没生效,完整代码如下 @container 兼容性一般,建议用最新版本的 chrome/safari/firefox 打开

  • 免责声明: 这是一篇相当长的文章。我首先解释我正在处理的数据,以及我想用它做什么 然后,我详细介绍了我考虑过的三种可能的解决方案,因为我试着做作业(我发誓:])。我最后得到了一个“最佳猜测”,这是第一个解决方案的变体。 我的终极问题是:使用Cassandra解决我的问题的最明智的方法是什么?这是我的尝试之一,还是其他什么? 我正在寻求经验丰富的Cassandra用户的建议/反馈… 我的数据:< b

  • 问题内容: 我正在使用输出JSON文件的系统,并且使用Python解析数据并将其显示在UI(PySide)中。我现在想向该系统添加过滤,我认为与其编写一个查询系统,而不是编写查询系统,如果有一个用于JSON(在Python中)的查询系统,那将节省很多开发时间。 但这更多的是基于Web的系统。关于Python等效的任何想法吗? 编辑[为清楚起见]: 我将生成的数据格式如下: “子项”可以嵌套同一事物

  • 本文向大家介绍Oracle SQL树形结构查询,包括了Oracle SQL树形结构查询的使用技巧和注意事项,需要的朋友参考一下 oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: id,parentid那么通过

  • 问题内容: 在hibernate状态下,我想运行此JPQL / HQL查询: userDTO类: 用户实体: 但是当Hibernate 3.5(JPA 2)启动时,出现此错误: 结果是否可能包含列表(u.securityRoles)的选择? 我应该只创建2个单独的查询吗? 问题答案: 没有(选择标量值 和 集合值的路径表达式)的查询无效,因此我认为添加a 不会使事情起作用。 作为记录,这是JPA