请参阅此背景:Azure 数据资源管理器:分区策略和合并策略如何工作?
我创建了一个表,其分区策略基于字符串和时间戳列。使用此策略,我的查询的性能提升是巨大的:
"PartitionKeys": [
{
"ColumnName": "sensor_id",
"Kind": "Hash",
"Properties": {
"Function": "XxHash64",
"MaxPartitionCount": 30,
"Seed": 1,
"PartitionAssignmentMode": "Uniform"
}
},
{
"ColumnName": "timestamp",
"Kind": "UniformRange",
"Properties": {
"Reference": "1970-01-01T00:00:00",
"RangeSize": "15.00:00:00",
"OverrideCreationTime": true
}
}
],
使用
.show database extents partitioning statistics
我也确信我有 100% PartionedRowPercentage。
但是,在 15 天的时间内,我获得了 79 个范围,并且这些范围未接近合并和分片策略设置的最大大小。因此,我试图找到特定范围内的元数据。
我的第一个问题是是否有人知道显示一定范围的分区元数据的命令。
我的第二个问题是,当我运行以下查询时,每个传感器 ID 的输出差异很大,但特定范围内的每个sensor_id 不应该具有相同的 XxHash64 函数输出吗?
T
| where extent_id() == "e1ccecab-522c-48ce-801f-5b173add04e7"
| distinct sensor_id
| project sensor_id, hashed= hash_xxhash64(sensor_id, 30)
| sort by hashed asc
我的第一个问题是是否有人知道显示某个范围的分区元数据的命令。
没有正式的方法来证明这一点(分区元数据格式也不是契约性的)。
也就是说,给定一个范围,您可以运行类似的命令来查看分区键值 - 如果该范围已分区,您应该获得一个分区键值。
TableName
| where extent_id() == '<some_guid>'
| summarize row_count = count()
by
hash_partition_value = hash_xxhash64(<hash_partition_column_name>, <max_partition_count>),
datetime_partition_value = bin_at(<datetime_partition_column_name>, <range_size>, <reference>)
<
、>
中封装的所有变量都可以在您定义的策略中找到。
我的第二个问题是,当我运行以下查询时,每个传感器ID的输出有很大不同,但特定范围内的每个sensor_id不应该具有相同的XxHash64函数输出吗?
在分区范围中,对于范围分区所依据的参数,所有记录都属于同一个哈希/日期时间分区。即
hash_xxhash64(<hash_partition_column_name>, <max_partition_count>)
对于该范围内的所有记录应具有相同的值。
如果您看到不同的结果,则意味着范围未分区,或者根据您之前设置的不同策略进行分区(例如,检查您是否忘记修改当前策略的
EffectiveDateTime
,以重新分区之前-根据您设置的不同策略进行分区的分区范围)