• 访问计划的搜索过程

    访问计划的搜索过程

    使用 SdbQuery.explain() 可以查看访问计划的搜索过程的信息。

    当 SdbQuery.explain() 的 Search 选项为 true 时,将展示以下信息(Evaluate 选项为 true 时显示 Constants 和 Input 字段):

    字段名类型描述
    ConstantsBSON 对象生成访问计划使用的常量Evaluate 选项为 true 时显示
    Constants.RandomReadIOCostUnit整型随机读取 IO 的代价,默认值为 10
    Constants.SeqReadIOCostUnit整型顺序读取 IO 的代价,默认值为 1
    Constants.SeqWrtIOCostUnit整型顺序写入 IO 的代价,默认值为 2
    Constants.PageUnit整型数据页的单位,默认值为 4096 (单位:字节)
    Constants.RecExtractCPUCost整型从数据页中提取数据的 CPU 代价,默认值为 4
    Constants.IXExtractCPUCost整型从索引页中提取索引项的 CPU 代价,默认值为 2
    Constants.OptrCPUCost整型操作符的 CPU 代价单位,默认值为 1
    Constants.IOCPURate整型IO 代价与 CPU 代价的比例,默认值为 2000
    Constants.TBScanStartCost整型全表扫描的启动代价,默认值为 0
    Constants.IXScanStartCost整型索引扫描的启动代价,默认值为 0
    OptionsBSON生成访问计划使用的配置项,即 SequoiaDB 的配置
    Options.optcostthreshold整型SequoiaDB 的 —optcostthreshold 选项,查询优化器忽略 IO 影响的最小的页数数据页数大于阈值时,估算访问计划代价时需要计算 IO 的代价默认值为 20,0 表示一直需要计算 IO 代价,-1 表示从不计算代价
    Options.sortbuf整型SequoiaDB 的 —sortbuf 选项排序缓存大小(单位:MB),默认值为 256 ,最小值为 128
    InputBSON 对象生成访问计划使用的输入项,集合的统计信息Evaluate 选项为 true 时显示
    Input.Pages整型集合的数据页个数
    Input.Records长整型集合的数据个数
    Input.RecordSize整型集合的数据平均长度
    Input.NeedEvalIO布尔型根据 Input.Pages 和 Options.optcostthreshold 判断是否需要计算 IO 代价
    Input.CLEstFromStat布尔型是否使用集合的统计信息进行估算
    Input.CLStatTime时间戳使用的集合的统计信息的生成时间
    SearchPaths数组每个搜索过的访问计划的估算过程

    Note:

    • Constants 字段下的值为常量不可进行设置
    • Options 字段下的值可以通过 SequoiaDB 的配置来设置

    SearchPaths 数组的每项表示一个搜索过的访问计划,将展示以下信息:

    字段名类型描述
    ScanType字符串访问计划的扫描方式1. "tbscan" 表示全表扫描2. "ixscan" 表示索引扫描
    IndexName字符串访问计划使用的索引的名称全表扫描时为 ""
    UseExtSort布尔型访问计划是否使用非索引排序
    Direction整型访问计划使用索引时的扫描方向1 表示正向扫描索引-1 表示反向扫描索引
    QueryBSON 对象访问计划解析后的用户查询条件
    IXBoundBSON 对象访问计划使用索引的查找范围表扫描为 null
    NeedMatch布尔型访问计划获取记录时是否需要根据匹配符进行过滤NeedMatch 为 false 的情况有:1. 没有查询条件2. 查询条件可以被索引覆盖
    IXEstFromStat布尔型是否使用索引的统计信息进行估算(索引扫描时显示)
    IXStatTime时间戳使用的索引的统计信息的生成时间(索引扫描时显示)
    Score浮点型评分:1. 索引扫描为索引的选择率(< 0.1时为候选计划)2. 全表扫描为匹配符的选择率
    IsCandidate布尔型是否候选访问计划,不是候选计划不进行估算1. 索引扫描选择率 < 0.12. 索引扫描完全匹配排序字段3. 全表扫描
    IsUsed布尔型是否最终选择的访问计划
    TotalCost浮点型估算的代价(内部表示 单位约为 1/2000000 秒)该代价不包括选择符、skip() 和 limit() 的影响
    ScanNodeBSON 对象TBSCAN 的推演公式 或 IXSCAN 推演公式Evaluate 选项为 true 时显示
    SortNodeBSON 对象SORT 的推演公式Evaluate 选项为 true 且需要进行排序时显示

    Evaluate 选项为 true 时将展示查询优化器的推演公式,每个需要计算的变量将以数组形式展示:

    1. 变量: [
    2. 公式,
    3. 代入数据的计算公式,
    4. 计算结果
    5. ]
    • TBSCAN的推演公式
    • IXSCAN的推演公式
    • SORT的推演公式

    Note:

    推演公式中的代价均为内部表示,单位约为 1/2000000 秒

    示例

    1. {
    2. ...,
    3. "Search": {
    4. "Options": {
    5. "sortbuf": 256,
    6. "optcostthreshold": 20
    7. },
    8. "Constants": {
    9. "RandomReadIOCostUnit": 10,
    10. "SeqReadIOCostUnit": 1,
    11. "SeqWrtIOCostUnit": 2,
    12. "PageUnit": 4096,
    13. "RecExtractCPUCost": 4,
    14. "IXExtractCPUCost": 2,
    15. "OptrCPUCost": 1,
    16. "IOCPURate": 2000,
    17. "TBScanStartCost": 0,
    18. "IXScanStartCost": 0
    19. },
    20. "Input": {
    21. "Pages": 1,
    22. "Records": 10,
    23. "NeedEvalIO": false,
    24. "CLEstFromStat": false
    25. },
    26. "SearchPaths": [
    27. {
    28. "IsUsed": false,
    29. "IsCandidate": false,
    30. "Score": 1,
    31. "ScanType": "ixscan",
    32. "IndexName": "$id",
    33. "UseExtSort": false,
    34. "Direction": 1,
    35. "IXBound": {
    36. "_id": [
    37. [
    38. {
    39. "$minElement": 1
    40. },
    41. {
    42. "$maxElement": 1
    43. }
    44. ]
    45. ]
    46. },
    47. "NeedMatch": false,
    48. "IXEstFromStat": false
    49. },
    50. ...
    51. ]
    52. }
    53. }