访问计划的搜索过程

使用 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. ]

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. }