- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个场景,我存储大量第三方数据以供业务用户进行临时分析。大多数针对数据的查询都会很复杂,需要使用多个自连接、投影和范围。
在选择用于 Azure DocumentDB 的 PartitionKey
时,我看到人们建议使用逻辑分隔符,例如 TenantId、DeviceId 等。
然而,鉴于 DocumentDB 的并行性质,我很好奇它如何处理基于某种 GUID 或大整数的 PartitionKey
,以便在大量读取期间,它将高度并行化.
考虑到这一点,我设计了一个包含两个集合的测试:
测试-col-1
PartitionKey
是具有大约 100 个可能值的 TenantId测试-col-2
PartitionKey
是第三方分配的唯一值,遵循模式“AB1234568”。由第三方保证全局唯一。两个集合都设置为 100,000 RU。
在我的实验中,我加载了两个包含大约 2,000 个文档的集合。每个文档的大小大约为 20 KB,并且是高度非规范化的。每个文档是一个订单,其中包含多个作业,每个作业包含用户、价格等。
示例查询:
SELECT
orders.Attributes.OrderNumber,
orders.Attributes.OpenedStamp,
jobs.SubOrderNumber,
jobs.LaborTotal.Amount As LaborTotal,
jobs.LaborActualHours As LaborHours,
jobs.PartsTotal.Amount As PartsTotal,
jobs.JobNumber,
jobs.Tech.Number As TechNumber,
orders.Attributes.OrderPerson.Number As OrderPersonNumber,
jobs.Status
FROM orders
JOIN jobs IN orders.Attributes.Jobs
JOIN tech IN jobs.Techs
WHERE orders.TenantId = @TentantId
AND orders.Attributes.Type = 1
AND orders.Attributes.Status IN (4, 5)";
在测试中我调整了以下设置:
ConnectionPolicy
ConnectionPolicy
ConnectionMode.Direct
、Protocol.Tcp
MaxDegreeOfParallelism
值MaxBufferedItemCount
使用 EnableCrossPartitionQuery = true
查询具有 GUID PartitionKey 的集合。我正在使用 C# 和 .NET SDK v1.14.0。
在使用默认设置的初始测试中,我发现使用 TentantId
作为 PartitionKey 查询集合的速度更快,与 相比,平均需要 3,765 毫秒>4,680 毫秒(在 GUID 键控集合上)。
当我使用 TCP
将 ConnectionPolicy
设置为 Direct
时,我发现 TenantID
集合查询时间减少了近乎1000 毫秒,平均为2,865 毫秒,而 GUID 收集增加了约 800 毫秒,平均为5,492 毫秒。
当我开始使用 MaxDegreeOfParellelism
和 MaxBufferedItemCount
时,事情开始变得有趣。 TentantID
集合查询时间通常不受影响,因为查询不是跨集合,但 GUID 集合的速度显着加快,达到450 毫秒的值( >MaxDegreeOfParellelism
= 2000,MaxBufferedItemCount
= 2000)。
鉴于这些观察结果,为什么您不想使 PartitionKey
的值尽可能广泛?
最佳答案
Things started getting interesting when I started playing around with MaxDegreeOfParellelism and MaxBufferedItemCount. The TentantID collection query times were generally unaffected because the query wasn't cross-collection, however the GUID collection sped up considerably, reaching values as fast as 450 ms (MaxDegreeOfParellelism = 2000, MaxBufferedItemCount = 2000).
MaxDegreeOfParallelism可以设置 ParallelOptions 实例启用的最大并发任务数。据我所知,这是客户端并行性,它会消耗您站点上的 CPU/内存资源。
Given these observations, why would you not want to make the PartitionKey as broad a value as possible?
对于写入操作,我们可以跨分区键进行扩展,以便使用您配置的整个空间。而对于读取操作,我们需要尽量减少跨分区查找以降低延迟。
此外,正如该官方文档提到的:
The choice of the partition key is an important decision that you have to make at design time. You must pick a property name that has a wide range of values and has even access patterns.
It is a best practice to have a partition key with many distinct values (100s-1000s at a minimum).
To achieve the full throughput of the container, you must choose a partition key that allows you to evenly distribute requests among some distinct partition key values.
更多详情,您可以引用How to partition and scale in Azure Cosmos DB这个 channel 9 教程是关于 Azure DocumentDB Elastic Scale - Partitioning .
关于azure - DocumentDB PartitionKey 和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44128354/
我有一个场景,我存储大量第三方数据以供业务用户进行临时分析。大多数针对数据的查询都会很复杂,需要使用多个自连接、投影和范围。 在选择用于 Azure DocumentDB 的 PartitionKey
我正在尝试通过 azure 存储资源管理器将数据从 csv 文件加载/导入到表存储中,但我收到以下错误 打开文件“D//sample.csv”时出错。未指定所需的属性“Partitionkey”。 请
我想使用 PartitionKey 和日期时间过滤器获取一段时间内的数据。 https://sa.table.core.windows.net/ABC()?$filter=Timestamp%20gt
我希望获得所选分区中所有文档的数量。但是,以下代码将返回集合中所有文档的计数并且成本为 0 RU。 var collectionLink = UriFactory.CreateDocument
我正在尝试从 Azure Cosmos Db 集合中检索文档。我遇到了一个错误 Servlet.service() for servlet [dispatcherServlet] in context
我正在尝试配置 Semantinc Logging 退出进程以写入 Azure。 我终于成功地将事件写入表存储中。我的问题是如何定义 PartitionKey。 我刚刚插入了几个测试,Partitio
我正在开发一个全局应用程序,其中大多数搜索都基于地理空间数据(给定坐标的最近记录)和日期范围。 所以,基本上可能是 AirBnb、Booking 等应用程序的主要搜索。 考虑到这些上下文,我应该在 D
我正在开发一个全局应用程序,其中大多数搜索都基于地理空间数据(给定坐标的最近记录)和日期范围。 所以,基本上可能是 AirBnb、Booking 等应用程序的主要搜索。 考虑到这些上下文,我应该在 D
我正在使用 Linux 诊断监视附加到 Azure VM 的 VHD。使用 CLI 启用诊断时,监控数据最终位于 PublicConfig.json 中指定的表 (LinuxDiskMetric) 中
我创建 DynamicTableEntity 如下: string env = "envTest"; stting ver = "1.0"; siring id = "12356"; string m
我有一个分区键列表,如 ListpartitionIds。我想查询 Azure 表存储以获取所有实体,例如: var query = (from result in dataServiceContex
了解 Azure 存储表。 对于包含地址和其他字段的人员表,设置 PartitionKey 和 RowKey 来优化这样的查询的最佳方法是什么? SELECT * FROM {table} WHERE
GET/Product()?$filter=((PartitionKey%20eq%20'lIkfA81JpTmv')%20and%20(RowKey%20eq%20'')) %20或%20((Par
我有一个包含 PartitionKey.i 的集合,它创建了一个接受查询作为参数的存储过程。在此存储过程中,我正在获取一些要更新的文档,但在获取时显示错误,提示当我使用该方法时提供 Partition
我正在尝试从 Cosmos DB 中删除文档 我的代码是这样的: public async Task DeletePartner(string id) { va
GET/Product()?$filter=((PartitionKey%20eq%20'lIkfA81JpTmv')%20and%20(RowKey%20eq%20'')) %20或%20((Par
我有一个包含 PartitionKey.i 的集合,它创建了一个接受查询作为参数的存储过程。在此存储过程中,我正在获取一些要更新的文档,但在获取时显示错误,提示当我使用该方法时提供 Partition
我正在尝试从 Cosmos DB 中删除文档 我的代码是这样的: public async Task DeletePartner(string id) { va
使用 SQL api,您可以在 SQL 语句中指定分区键,例如SELECT * FROM c WHERE c.MyPartitionKey = 'KeyValue' 或使用 FeedOptions.P
使用 Azure 表,如果我知道实体的 RowKey 和 PartitionKey(以便我可以检索该实体),如何编辑该实体的特定属性值? 这听起来像是一个非常标准的操作,但正常的做法是这样的: pub
我是一名优秀的程序员,十分优秀!