执行计划是数据库服务器用来访问数据库中与语句相关的信息的步骤集。无论语句的执行计划是否刚经过优化、是否跳过了优化程序,也无论其计划是否是从先前的执行进行的高速缓存,均可进行保存和查看。查询执行计划可能会与初始语句中所使用的语法不完全对应。但在语义上是等效的,而且可使用实现化视图 (Materialized View) 来代替查询中显式指定的基表。
有关语句在其执行之前要经历的阶段的详细信息,请参见查询处理的阶段。
有关数据库服务器在重写查询时所遵循的规则的详细信息,请参见语义查询转换和使用实现化视图 (Materialized View) 提高性能。
优化程序的工作是理解查询的语义并构建用于计算查询结果的计划。访问计划可能与您使用的语法并不完全对应。优化程序可以自由地使用语义上等效的任意形式重写查询。
有关 SQL Anywhere 在重写查询时所遵循的规则的详细信息,请参见将子查询重写为 EXISTS 谓语和语义查询转换。
有关优化程序用来实现查询的方法的信息,请参见[查询执行] 算法。
您可以在 Interactive SQL 中查看执行计划,也可以使用 SQL 函数查看执行计划。可选择检索以下几种不同格式的执行计划:
还可以通过使用 GRAPHICAL_PLAN 和 EXPLANATION 函数并利用特定的游标类型来获取 SQL 查询的计划。请参见GRAPHICAL_PLAN 函数 [Miscellaneous]和EXPLANATION 函数 [Miscellaneous]。
有关如何保存和查看计划的详细信息,请参见访问执行计划。
下面将介绍访问计划中显示的统计信息以及其它项。
下面是简要计划以及图形式计划的简称形式中使用的缩写:
| 缩写 | 名称 |
|---|---|
| DELETE | 删除 |
| DistH | 非重复散列 |
| DistO | 非重复排序 |
| DT | 派生表 |
| EAH | 排除所有散列 |
| EAM | 排除所有合并 |
| EH | 排除散列 |
| EM | 排除合并 |
| Exchange | 交换 |
| Filter | 过滤 |
| FS | 文件扫描 |
| GrByH | 散列分组依据 |
| GrByHClust | 按照聚簇进行散列分组 |
| GrByHP | 并行散列分组依据 |
| GrByHSets | 按照集进行散列分组 |
| GrByO | 排序分组依据 |
| GrByOSets | 按照集进行排序分组 |
| GrByS | 单行分组依据 |
| GrBySSets | 按照集进行分组 |
| HF | 散列过滤 |
| HFP | 并行散列过滤 |
| HTS | 散列表扫描 |
| IAH | 交叉所有散列 |
| IAM | 交叉所有合并 |
| IH | 交叉散列 |
| IM | 交叉合并 |
| IN | IN 列表 |
| INSENSITIVE | 不敏感 |
| INSERT | 插入 |
| IS |
索引扫描 在简要计划中,它为 table-name 后跟 <rowID>, <seq> 或 <rowID>。在图形式计划中,它只为 table-name。 |
| ISP | 并行索引扫描 |
| JE | 存在连接 |
| JH | 散列连接 |
| JHE | 存在散列连接 |
| JHEP | 存在并行散列连接 |
| JHFO | 完全外散列连接 |
| JHNE | 不存在散列连接 |
| JHNEP | 不存在并行散列连接 |
| JHO | 左外散列连接 |
| JHP | 并行散列连接 |
| JHPO | 并行左外散列连接 |
| JHR | 递归散列连接 |
| JHRO | 递归左外散列连接 |
| JM | 合并连接 |
| JMFO | 完全外部合并连接 |
| JMO | 左外部合并连接 |
| JNL | 嵌套循环连接 |
| JNLFO | 完全外部嵌套循环连接 |
| JNLO | 左外部嵌套循环连接 |
| KEYSET | 键集 |
| LOAD | 装载 |
| PC | 过程调用(表函数) |
| PreFilter | 预过滤器 |
| RowID Scan |
行标识符扫描 在简要计划中,它为 table-name <rowID>。在图形式计划中,它只为 table-name。 |
| ROWS | 行构造函数 |
| RL | 行限制 |
| RR | 行重复 |
| RT | 递归表 |
| RU | 递归联合 |
| SELECT | 选择 |
| Sort | 排序(索引或合并) |
| SrtN | 对前 N 个排序 |
| TS |
表扫描 在简要计划中,它为 table-name <seq>。在图形式计划中,它只为 table-name。 |
| TSP | 并行表扫描 |
| UA | 全部联合 |
| UPDATE | 更新 |
| Window | 窗口 |
| Work | 工作表 |
有关算法的说明,请参见[查询执行] 算法。
下面的统计信息是实际的测量值。
| 统计 | 解释 |
|---|---|
| Invocations | 从子树中请求行的次数。 |
| RowsReturned | 为当前节点返回的行数。 |
| RunTime | 执行子树所需的时间(包括执行子项所需的时间)。 |
| CacheHits | 成功读取高速缓存的次数。 |
| CacheRead | 已经在高速缓存中查找的数据库页数。 |
| CacheReadTable | 已经从高速缓存中读取表页数。 |
| CacheReadIndLeaf | 已经从高速缓存中读取的索引叶页数。 |
| CacheReadIndInt | 已经从高速缓存中读取的索引内部节点页数。 |
| DiskRead | 已经从磁盘中读取的页数。 |
| DiskReadTable | 已经从磁盘中读取的表页数。 |
| DiskReadIndLeaf | 已经从磁盘中读取的索引叶页数。 |
| DiskReadIndInt | 已经从磁盘中读取的索引内部节点页数。 |
| DiskWrite | 已经写入磁盘的页数(工作表页数或修改表页数)。 |
| IndAdd | 已经添加到索引中的条目数。 |
| IndLookup | 已经在索引中查找的条目数。 |
| FullCompare | 已经在索引中的散列值之上执行的比较次数。 |
| 统计 | 解释 |
|---|---|
| EstRowCount | 节点在每次被调用时将返回的估计行数。 |
| AvgRowCount | 每次调用时返回的平均行数。这不是估计值,而是按照 RowsReturned/Invocations 进行计算。如果该值与 EstRowCount 之间的差值很大,则说明选择性估计值可能会不正确。 |
| EstRunTime | 执行所需的估计时间(EstDiskReadTime、EstDiskWriteTime 和 EstCpuTime 的总和)。 |
| AvgRunTime | 执行所需的平均时间(测量值)。 |
| EstDiskReads | 从磁盘中读取的估计次数。 |
| AvgDiskReads | 从磁盘中读取的平均次数(测量值)。 |
| EstDiskWrites | 写入磁盘的估计次数。 |
| AvgDiskWrites | 写入磁盘的平均次数(测量值)。 |
| EstDiskReadTime | 从磁盘中读取行所需的估计时间。 |
| EstDiskWriteTime | 将行写入磁盘所需的估计时间。 |
| EstCpuTime | 执行所需的估计处理器时间。 |
| 项 | 解释 |
|---|---|
| 优化目标 | 确定优化查询处理的意图:是迅速返回第一行,还是为最大程度地降低返回整个结果集的开销。请参见optimization_goal 选项 [数据库]。 |
| 优化负载 | 确定优化查询处理的目标是针对更新和读取混合进行的负载还是针对主要基于读取的负载。请参见optimization_workload 选项 [数据库]。 |
| ANSI 更新约束 | 控制允许的更新范围(选项包括 Off、Cursors 和 Strict)。请参见ansi_update_constraints 选项 [兼容性] |
| 优化级别 | 保留。 |
| 选择列表 | 查询所选择的表达式的列表。 |
| 实现化视图 (Materialized View) |
优化程序考虑的实现化视图 (Materialized View) 的列表。列表中的每个条目均为以下格式的元组: view-matching-outcome 的值包括:
有关阻止优化程序使用实现化视图 (Materialized View) 的限制和条件的详细信息,请参见使用实现化视图 (Materialized View) 提高性能和管理实现化视图 (Materialized View) 时的限制 |
| 项 | 解释 |
|---|---|
| 被锁定的表 | 所有被锁定的表及其关联的隔离级别的列表。 |
| 项 | 解释 |
|---|---|
| 表名 | 表的实际名称。 |
| 相关名 | 表的别名。 |
| 估计行数 | 表中的估计行数。 |
| 估计页数 | 表中的估计页数。 |
| 估计行大小 | 表的估计行大小。 |
| 页位置图 | 在使用页位置图来读取多页时为 [是]。 |
| 项 | 解释 |
|---|---|
| 索引名 | 索引的名称。 |
| 键类型 | 可以是 PRIMARY KEY(主键)、FOREIGN KEY(外键)、CONSTRAINT(唯一约束)或 UNIQUE(唯一索引)之一。如果索引是非唯一的辅助索引,则不会显示键类型。 |
| 深度 | 索引的高度。请参见表大小和页面大小。 |
| 估计叶页数 | 估计的叶页数。 |
| 基数 | 索引的基数(如果它不同于估计行数)。这仅适用于 SQL Anywhere 数据库版本 6.0.0 及更早版本。 |
| 选择性 | 匹配域范围的估计行数。 |
| 方向 | FORWARD(向前)或 BACKWARD(向后)。 |
| 域范围 | 域范围显示为列表 (col_name=value) 或 col_name IN [low, high]。 |
| 项 | 解释 |
|---|---|
| 谓语 | 在此节点中求出的搜索条件以及选择性估计值和测量值。请参见计划中的选择性 |
| 项 | 解释 |
|---|---|
| 生成值 | 输入中的不重复值的估计数。 |
| 探测值 | 查看谓语时输入中的不重复值的估计数。 |
| 位 | 选择生成散列映射的位数。 |
| 页 | 存储散列映射所需的页数。 |
| 项 | 解释 |
|---|---|
| 联合列表 | UNION 语句中涉及的列。 |
| 项 | 解释 |
|---|---|
| 集合 | 所有集合函数。 |
| GROUP BY列表 | GROUP BY 子句中的所有列。 |
| 项 | 解释 |
|---|---|
| DISTINCT 列表 | DISTINCT 子句中的所有列。 |
| 项 | 解释 |
|---|---|
| IN 列表 | 指定集合中的所有表达式。 |
| 表达式 SQL | 要与该列表进行比较的表达式。 |
| 项 | 解释 |
|---|---|
| Order-by | 列出要作为排序依据的所有表达式。 |
| 项 | 解释 |
|---|---|
| 行限制计数 | 按照 FIRST 或 TOP n 的指定所返回的最大行数。 |