文档中心

关于 SequoiaDB

快速入门

安装

基本操作

数据模型

SQL引擎

S3引擎

系统架构

数据库管理

连接器

驱动

参考手册

故障排除

SAC 管控中心

Web服务

版本信息

统计信息

SequoiaDB在查询优化中使用的统计信息,包含集合和索引的数据分布信息。查询优化器可以根据这些统计信息来估计查询结果中的基数,从而创建高质量的查询计划。

在SequoiaDB中有两种统计信息,集合的统计信息和索引的统计信息。

集合的统计信息

集合的统计信息存放在数据节点的SYSSTAT.SYSCOLLECTIONSTAT集合中,具体的字段如下:

字段名 数据类型 默认值 必须 说明
CollectionSpace String 统计的Collection所在Collection Space的名称
Collection String 统计的Collection的名称(不带Collection Space名字)
CreateTime NumberLong 0 统计收集的时间戳
SampleRecords NumberLong 0 统计收集时抽样的文档个数
TotalRecords NumberLong 10 统计收集时的文档个数
TotalDataPages NumberInt 1 统计收集时的数据页个数
TotalDataSize NumberLong 统计收集时的数据总大小(字节数)
AvgNumFields NumberInt 10 文档的平均字段数

例子:

{
  "Collection": "foo",
  "CollectionSpace": "bar",
  "CreateTime": 1496910925978,
  "SampleRecords": 200,
  "TotalDataPages": 1284,
  "TotalDataSize": 65929411,
  "TotalRecords": 600000,
  "AvgNumFields" : 10
}

索引的统计信息

索引的统计信息存放在数据节点的SYSSTAT.SYSINDEXSTAT集合中,具体的字段如下:

字段名 数据类型 默认值 必须 说明
CollectionSpace String 统计的Collection所在Collection Space的名称
Collection String 统计的Collection的名称(不带Collection Space名字)
CreateTime NumberLong 0 统计收集的时间戳
Index String 统计Index的名称
KeyPattern BSONObj 统计索引的字段定义,例如:{a:1, b:-1}
SampleRecords NumberLong 0 统计收集时抽样的文档个数
TotalRecords NumberLong 10 统计收集时的文档个数
IndexPages NumberInt 1 统计收集时索引的页个数
IndexLevels NumberInt 1 统计收集时索引的层数
IsUnique BOOL FALSE Index是否唯一索引
MCV Object undefined 频繁数值集合(Most Common Values)
如:MCV: { Values: [ {a:1,b:1}, {a:2, b:2}, ... ], Frac: [ 1000, 1000, ... ] }
MCV.Values Array 是(如有MCV) 频繁数值的值
MCV.Frac Array 是(如有MCV) 频繁数值的比例,每个值的取值 0 ~ 10000,最终比例为 (Frac / 10000) * 100%
{

  "Collection": "foo",
  "CollectionSpace": "bar",
  "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
}

统计信息的使用

统计信息可以用于查询优化器评估索引的选择率,参考 基于代价的访问计划评估

相等比较的选择率估算

  1. 如果字段上建立的是唯一索引,则选择率为:selectivity = 1 / TotalRecords

  2. 如果相等比较的值落入频繁数值集合中,假设命中下标为 i,则选择率为:selectivity = MCV.Frac[i]

  3. 如果相等比较的值没有落入频繁数值集合中,则选择率为:selectivity = ( 1 - sum( MCV.Frac ) ) * 0.005

范围比较的选择率估算

  1. 如果相等比较的范围落入频繁数值集合中,假设命中下标为 m 至 n,则选择率为:selectivity = MCV.Frac[m] + ... + MCV.Frac[n]

  2. 如果相等比较的范围没有落入频繁数值集合中,则选择率为:selectivity = ( 1 - sum( MCV.Frac ) ) * 0.05

示例

统计信息中的字段 "val" 的频繁数值集合的内容为:

MCV : {
  Val : [
    1, 2, 3, 4, 5, 6, 7, 8, 9
  ],
  Frac : [
    1000, 1200, 800, 1300, 700, 1000, 1000, 1000, 1000
  ]
}
  1. { val : { $et : 1 } } 命中频繁数值集合,因此其选择率估算为:selectivity = 0.1
  2. { val : { $et : 10 } } 没有命中频繁数值集合,因此其选择率估算为:selectivity = 0.1 * 0.005 = 0.0005
  3. { val : { $lt : 4 } } 命中了频繁数值集合的下标0、1 和 2,因此其选择率估算为:selectivity = 0.1 + 0.12 + 0.08 = 0.2

Note:

频繁数值的比例,每个值的取值 0 ~ 10000,最终比例为 (Frac / 10000) * 100%

统计信息的收集

请参考db.analyze()

回到顶部