• 统计信息
    • 集合的统计信息
    • 索引的统计信息
    • 统计信息的使用
    • 统计信息的收集

    统计信息

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

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

    集合的统计信息

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

    字段名数据类型默认值必须说明
    CollectionSpaceString统计的Collection所在Collection Space的名称
    CollectionString统计的Collection的名称(不带Collection Space名字)
    CreateTimeNumberLong0统计收集的时间戳
    SampleRecordsNumberLong0统计收集时抽样的文档个数
    TotalRecordsNumberLong10统计收集时的文档个数
    TotalDataPagesNumberInt1统计收集时的数据页个数
    TotalDataSizeNumberLong统计收集时的数据总大小(字节数)
    AvgNumFieldsNumberInt10文档的平均字段数

    例子:

    1. {
    2. "Collection": "foo",
    3. "CollectionSpace": "bar",
    4. "CreateTime": 1496910925978,
    5. "SampleRecords": 200,
    6. "TotalDataPages": 1284,
    7. "TotalDataSize": 65929411,
    8. "TotalRecords": 600000,
    9. "AvgNumFields" : 10
    10. }

    索引的统计信息

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

    字段名数据类型默认值必须说明
    CollectionSpaceString统计的Collection所在Collection Space的名称
    CollectionString统计的Collection的名称(不带Collection Space名字)
    CreateTimeNumberLong0统计收集的时间戳
    IndexString统计Index的名称
    KeyPatternBSONObj统计索引的字段定义,例如:{a:1, b:-1}
    SampleRecordsNumberLong0统计收集时抽样的文档个数
    TotalRecordsNumberLong10统计收集时的文档个数
    IndexPagesNumberInt1统计收集时索引的页个数
    IndexLevelsNumberInt1统计收集时索引的层数
    IsUniqueBOOLFALSEIndex是否唯一索引
    MCVObjectundefined频繁数值集合(Most Common Values) 如:MCV: { Values: [ {a:1,b:1}, {a:2, b:2}, … ], Frac: [ 1000, 1000, … ] }
    MCV.ValuesArray是(如有MCV)频繁数值的值
    MCV.FracArray是(如有MCV)频繁数值的比例,每个值的取值 0 ~ 10000,最终比例为 (Frac / 10000) * 100%
    1. {
    2.  
    3. "Collection": "foo",
    4. "CollectionSpace": "bar",
    5. "CreateTime": 1496910926035,
    6. "Index": "index",
    7. "IndexLevels": 2,
    8. "IndexPages": 256,
    9. "IsUnique": false,
    10. "KeyPattern": {
    11. "a": 1
    12. },
    13. "MCV": {
    14. "Values": [
    15. {
    16. "a": 2358
    17. },
    18. {
    19. "a": 7074
    20. },
    21. {
    22. "a": 11790
    23. },
    24. ...
    25. ],
    26. "Frac": [
    27. 50,
    28. 50,
    29. 50,
    30. ...
    31. ]
    32. },
    33. "SampleRecords": 200,
    34. "TotalRecords": 600000
    35. }

    统计信息的使用

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

    相等比较的选择率估算

    • 如果字段上建立的是唯一索引,则选择率为: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" 的频繁数值集合的内容为:

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

    Note:

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

    统计信息的收集

    请参考db.analyze()。