统计信息
SequoiaDB 巨杉数据库提供收集统计信息的能力。外部收集而来的统计信息用于分析处理,分析后的最优结果将会被用于生成最优的访问计划,以此提高查询效率。因此统计信息对查询访问计划的构成以及查询性能起关键性作用。 SequoiaDB 包含两种统计信息,分别是集合的统计信息和索引的统计信息。
集合的统计信息
- 集合的统计信息存放在数据节
SYSSTAT.SYSCOLLECTIONSTAT
集合中,具体字段如下:
字段名 | 数据类型 | 默认值 | 必须 | 说明 |
---|---|---|---|---|
CollectionSpace | String | 是 | 统计收集的集合空间名 | |
Collection | String | 是 | 统计收集的集合名 | |
CreateTime | NumberLong | 0 | 是 | 统计收集的时间戳 |
SampleRecords | NumberLong | 0 | 是 | 统计收集时抽样的文档个数 |
TotalDataPages | NumberInt | 1 | 是 | 统计收集时的数据页个数 |
TotalDataSize | NumberLong | 是 | 统计收集时的数据总大小(字节数) | |
TotalRecords | NumberLong | 10 | 是 | 统计收集时的文档个数 |
AvgNumFields | NumberInt | 10 | 否 | 文档的平均字段数 |
- SYSSTAT.SYSCOLLECTIONSTAT 统计信息示例:
{
"Collection": "sample",
"CollectionSpace": "employee",
"CreateTime": 1496910925978,
"SampleRecords": 200,
"TotalDataPages": 1284,
"TotalDataSize": 65929411,
"TotalRecords": 600000,
"AvgNumFields" : 10
}
索引的统计信息
- 索引的统计信息存放在数据节点 SYSSTAT.SYSINDEXSTAT 集合中,具体字段如下:
字段名 | 数据类型 | 默认值 | 必须 | 说明 |
---|---|---|---|---|
CollectionSpace | String | 是 | 统计收集的集合空间名 | |
Collection | String | 是 | 统计收集的集合名 | |
CreateTime | NumberLong | 0 | 是 | 统计收集的时间戳 |
Index | String | 是 | 统计收集的索引名 | |
IndexLevels | NumberInt | 1 | 是 | 统计收集时索引的层数 |
IndexPages | NumberInt | 1 | 是 | 统计收集时索引页的个数 |
IsUnique | BOOL | FALSE | 是 | 统计收集的索引是否唯一索引 |
KeyPattern | BSONObj | 是 | 统计收集的索引字段定义,如:{a:1} | |
SampleRecords | NumberLong | 0 | 是 | 统计收集时抽样的文档个数 |
TotalRecords | NumberLong | 10 | 是 | 统计收集时的文档个数 |
MCV | Object | 否 | 频繁数值集合(Most Common Values),如: MCV: { Values: [ {a:1}, {a:2}, … ], Frac: [ 50, 50, … ] } | |
MCV.Values | Array | 否 | 频繁数值中的值 | |
MCV.Frac | Array | 否 | 频繁数值的比例,每个值的取值 0 ~ 10000,最终比例为 (Frac / 10000) * 100% |
- SYSSTAT.SYSINDEXSTAT 统计信息示例:
{
"Collection": "sample",
"CollectionSpace": "employee",
"CreateTime": 1496910926035,
"Index": "index",
"IndexLevels": 2,
"IndexPages": 256,
"IsUnique": false,
"KeyPattern": {
"a": 1
},
"MCV": {
"Values": [
{
"a": 2358
},
{
"a": 7074
},
{
"a": 11790
},
...
],
"Frac": [
50,
50,
50,
...
]
},
"SampleRecords": 200,
"TotalRecords": 600000
}
评估策略
查询优化器会根据统计信息对候选访问计划进行评估,以此选取合适的访问计划来执行查询,详情见基于代价的访问计划评估。
相等比较的选择率估算
- 如果字段建立了唯一索引,则选择率为:
selectivity = 1 / TotalRecords
- 如果相等比较的值落入频繁数值集合中,假设命中下标为 i,则选择率为:
selectivity = MCV.Frac[i]
- 如果相等比较的值没有落入频繁数值集合中,则选择率为:
selectivity = ( 1 - sum( MCV.Frac ) ) * 0.005
范围比较的选择率估算
- 如果相等比较的范围落入频繁数值集合中,假设命中下标为 m 至 n,则选择率为:
selectivity = MCV.Frac[m] + ... + MCV.Frac[n]
- 如果相等比较的范围没有落入频繁数值集合中,则选择率为:
selectivity = ( 1 - sum( MCV.Frac ) ) * 0.05
示例
如表中字段 val 建立了索引,生成该表的统计信息,字段 val 的频繁数值集合为:
MCV : {
Val : [
1, 2, 3, 4, 5, 6, 7, 8, 9
],
Frac : [
1000, 1200, 800, 1300, 700, 1000, 1000, 1000, 1000
]
}
- 如果字段索引是唯一索引,相等条件选择率为:
selectivity = 1 / TotalRecords
- 如果字段索引是普通索引,相等条件
{ val : { $et : 1 } }
命中频繁数值集合,其选择率为:selectivity = 0.1
- 如果字段索引是普通索引,相等条件
{ val : { $et : 10 } }
没有命中频繁数值集合,其选择率为:selectivity = 0.0005
- 范围条件
{ val : { $lt : 4 } }
命中了频繁数值集合的下标0、1 和 2,其选择率为:selectivity = 0.2
- 范围条件
{ val : { $gt : 9 } }
没有命中频繁数值集合,其选择率为:selectivity = 0.005
Note:
频繁数值的比例,每个值的取值范围为 0 ~ 10000,最终比例为(Frac / 10000) * 100%