云服务器内容精选

  • 执行计划显示信息 除了设置不同的执行计划显示格式外,还可以通过不同的EXPLAIN用法,显示不同详细程度的执行计划信息。常见有如下几种,关于更多用法请参见EXPLAIN语法说明。 EXPLAIN statement: 只生成执行计划,不实际执行。其中statement代表SQL语句。 EXPLAIN ANALYZE statement:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花掉的总时间(以毫秒计)和它实际返回的行数。 EXPLAIN PERFORMANCE statement:生成执行计划,进行执行,并显示执行期间的全部信息。 为了测量运行时在执行计划中每个节点的开销,EXPLAIN ANALYZE或EXPLAIN PERFORMANCE会在当前查询执行上增加性能分析的开销。在一个查询上运行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE有时会比普通查询明显地花费更多的时间。超支的数量依赖于查询的本质和使用的平台。 因此,当定位SQL运行慢问题时,如果SQL长时间运行未结束,建议通过EXPLAIN命令查看执行计划,进行初步定位。如果SQL可以运行出来,则推荐使用EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看执行计划及其实际的运行信息,以便更精准地定位问题原因。
  • 执行计划显示信息 除了设置不同的执行计划显示格式外,还可以通过不同的EXPLAIN用法,显示不同详细程度的执行计划信息。常见有如下几种,关于更多用法请参见EXPLAIN语法说明。 EXPLAIN statement: 只生成执行计划,不实际执行。其中statement代表SQL语句。 EXPLAIN ANALYZE statement:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花掉的总时间(以毫秒计)和它实际返回的行数。 EXPLAIN PERFORMANCE statement:生成执行计划,进行执行,并显示执行期间的全部信息。 为了测量运行时在执行计划中每个节点的开销,EXPLAIN ANALYZE或EXPLAIN PERFORMANCE会在当前查询执行上增加性能分析的开销。在一个查询上运行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE有时会比普通查询明显地花费更多的时间。超支的数量依赖于查询的本质和使用的平台。 因此,当定位SQL运行慢问题时,如果SQL长时间运行未结束,建议通过EXPLAIN命令查看执行计划,进行初步定位。如果SQL可以运行出来,则推荐使用EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看执行计划及其实际的运行信息,以便更精准地定位问题原因。
  • 执行计划显示格式 GaussDB 对执行计划提供了normal、pretty、summary、run四种显示格式: normal:代表使用默认的打印格式。图1中即为此显示格式。 pretty:代表使用GaussDB改进后的新显示格式。新的格式层次清晰,计划包含了plan node id,性能分析简单直接。如图2。 summary:是在pretty的基础上增加了对打印信息的分析。 run:在summary的基础上,将统计的信息输出到csv格式的文件中,以便于进一步分析。
  • 执行信息 在SQL调优过程中经常需要执行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看SQL语句实际执行信息,通过对比实际执行与优化器的估算之间的差别来为优化提供依据。EXPLAIN PERFORMANCE相对于EXPLAIN ANALYZE增加了每个DN上的执行信息。 以如下SQL语句为例: select count(1) from tb1; 执行EXPLAIN PERFORMANCE输出为: 图中显示执行信息分为以下7个部分 以表格的形式将计划显示出来,包含有11个字段,分别是:id、operation、A-time、A-rows、E-rows、E-distinct、Peak Memory、E-memory、A-width、E-width和E-costs。其中计划类字段(id、operation以及E开头字段)的含义与执行EXPLAIN时的含义一致,详见执行计划小节中的说明。A-time、A-rows、E-distinct、Peak Memory、A-width的含义说明如下: A-time:当前算子执行完成时间,一般DN上执行的算子的A-time是由[]括起来的两个值,分别表示此算子在所有DN上完成的最短时间和最长时间。 A-rows:表示当前算子的实际输出元组数。 E-distinct:表示hashjoin算子的distinct估计值。 Peak Memory:此算子在每个DN上执行时使用的内存峰值。 A-width:表示当前算子每行元组的实际宽度,仅对于重内存使用算子会显示,包括:(Vec)HashJoin、(Vec)HashAgg、(Vec) HashSetOp、(Vec)Sort、(Vec)Materialize算子等,其中(Vec)HashJoin计算的宽度是其右子树算子的宽度,会显示在其右子树上。 Predicate Information (identified by plan id): 这一部分主要显示的是静态信息,即在整个计划执行过程中不会变的信息,主要是一些join条件和一些filter信息。 Memory Information (identified by plan id): 这一部分显示的是整个计划中会将内存的使用情况打印出来的算子的内存使用信息,主要是Hash、Sort算子,包括算子峰值内存(peak memory),控制内存(control memory),估算内存使用(operator memory),执行时实际宽度(width),内存使用自动扩展次数(auto spread num),是否提前下盘(early spilled),以及下盘信息,包括重复下盘次数(spill Time(s)),内外表下盘分区数(inner/outer partition spill num),下盘文件数(temp file num),下盘数据量及最小和最大分区的下盘数据量(written disk IO [min, max] )。 Targetlist Information (identified by plan id) 这一部分显示的是每一个算子输出的目标列。 DataNode Information (identified by plan id): 这一部分会将各个算子的执行时间、CPU、buffer的使用情况全部打印出来。 User Define Profiling 这一部分显示的是CN和DN、DN和DN建连的时间,以及存储层的一些执行信息。 ====== Query Summary =====: 这一部分主要打印总的执行时间和网络流量,包括了各个DN上初始化和结束阶段的最大最小执行时间、CN上的初始化、执行、结束阶段的时间,以及当前语句执行时系统可用内存、语句估算内存等信息。 A-rows和E-rows的差异体现了优化器估算和实际执行的偏差度。一般来说,偏差越大,越可以认为优化器生成的计划越不可信,人工干预调优的必要性越大。 A-time中的两个值偏差越大,表明此算子的计算偏斜(在不同DN上执行时间差异)越大,人工干预调优的必要性越大。 Max Query Peak Memory经常用来估算SQL语句耗费内存,也被用来作为SQL语句调优时运行态内存参数设置的重要依据。一般会以EXPLAIN ANALYZE或EXPLAIN PERFORMANCE的输出作为进一步调优的输入。
  • 执行计划显示信息 除了设置不同的执行计划显示格式外,还可以通过不同的EXPLAIN用法,显示不同详细程度的执行计划信息。常见有如下几种,关于更多用法请参见EXPLAIN语法说明。 EXPLAIN statement: 只生成执行计划,不实际执行。其中statement代表SQL语句。 EXPLAIN ANALYZE statement:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花掉的总时间(以毫秒计)和它实际返回的行数。 EXPLAIN PERFORMANCE statement:生成执行计划,进行执行,并显示执行期间的全部信息。 为了测量运行时在执行计划中每个节点的开销,EXPLAIN ANALYZE或EXPLAIN PERFORMANCE会在当前查询执行上增加性能分析的开销。在一个查询上运行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE有时会比普通查询明显花费更多的时间。超出的时间多少取决于查询本身复杂程度和使用的平台。 因此,当定位SQL运行慢问题时,如果SQL长时间运行未结束,建议通过EXPLAIN命令查看执行计划,进行初步定位。如果SQL可以运行出来,则推荐使用EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看执行计划及其实际的运行信息,以便更精准地定位问题原因。
  • 执行计划显示信息 除了设置不同的执行计划显示格式外,还可以通过不同的EXPLAIN用法,显示不同详细程度的执行计划信息。常见有如下几种,关于更多用法请参见EXPLAIN语法说明。 EXPLAIN statement: 只生成执行计划,不实际执行。其中statement代表SQL语句。 EXPLAIN ANALYZE statement:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花掉的总时间(以毫秒计)和它实际返回的行数。 EXPLAIN PERFORMANCE statement:生成执行计划,进行执行,并显示执行期间的全部信息。 为了测量运行时在执行计划中每个节点的开销,EXPLAIN ANALYZE或EXPLAIN PERFORMANCE会在当前查询执行上增加性能分析的开销。在一个查询上运行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE有时会比普通查询明显花费更多的时间。超出的时间多少取决于查询本身复杂程度和使用的平台。 因此,当定位SQL运行慢问题时,如果SQL长时间运行未结束,建议通过EXPLAIN命令查看执行计划,进行初步定位。如果SQL可以运行出来,则推荐使用EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看执行计划及其实际的运行信息,以便更精准地定位问题原因。
  • 执行计划显示信息 除了设置不同的执行计划显示格式外,还可以通过不同的EXPLAIN用法,显示不同详细程度的执行计划信息。常见有如下几种,关于更多用法请参见EXPLAIN语法说明。 EXPLAIN statement:只生成执行计划,不实际执行。其中statement代表SQL语句。 EXPLAIN ANALYZE statement:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花费的总时间(以毫秒计)和它实际返回的行数。 EXPLAIN PERFORMANCE statement:生成执行计划,进行执行,并显示执行期间的全部信息。 为了测量运行时在执行计划中每个节点的开销,EXPLAIN ANALYZE或EXPLAIN PERFORMANCE会在当前查询执行上增加性能分析的开销。在一个查询上运行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE有时会比普通查询明显的花费更多的时间。超出的时间多少取决于查询本身复杂程度和使用的平台。 因此,当定位SQL运行慢问题时,如果SQL长时间运行未结束,建议通过EXPLAIN命令查看执行计划,进行初步定位。如果SQL可以运行出结果,则推荐使用EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看执行计划及其实际的运行信息,以便更精确地定位问题原因。
  • 执行计划显示信息 除了设置不同的执行计划显示格式外,还可以通过不同的EXPLAIN用法,显示不同详细程度的执行计划信息。常见有如下几种,关于更多用法请参见EXPLAIN语法说明。 EXPLAIN statement:只生成执行计划,不实际执行。其中statement代表SQL语句。 EXPLAIN ANALYZE statement:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花费的总时间(以毫秒计)和它实际返回的行数。 EXPLAIN PERFORMANCE statement:生成执行计划,进行执行,并显示执行期间的全部信息。 为了测量运行时在执行计划中每个节点的开销,EXPLAIN ANALYZE或EXPLAIN PERFORMANCE会在当前查询执行上增加性能分析的开销。在一个查询上运行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE有时会比普通查询明显的花费更多的时间。超出的时间多少取决于查询本身复杂程度和使用的平台。 因此,当定位SQL运行慢问题时,如果SQL长时间运行未结束,建议通过EXPLAIN命令查看执行计划,进行初步定位。如果SQL可以运行出结果,则推荐使用EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看执行计划及其实际的运行信息,以便更精确地定位问题原因。
  • 请求示例 执行指定资源栈下的执行计划 POST https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans/my_first_execution_plan 执行指定资源栈下的执行计划,并提供资源栈id以校验是否与当前资源栈匹配 POST https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans/my_first_execution_plan { "stack_id" : "f689e9fd-97e7-4185-bd8a-7d5f708d45d7" }
  • 响应参数 状态码: 202 表4 响应Body参数 参数 参数类型 描述 deployment_id String 标识部署的唯一Id,此Id由 资源编排 服务在触发部署、回滚等操作时生成,为UUID。 接受请求,进行异步处理。可以调用GetStackMetadata来获取异步请求的部署状态 注意: 部署资源栈后,资源编排服务持久化请求并立即返回,客户端不等待请求最终处理完成,用户无法实时感知请求处理结果 资源编排服务最终会将异步部署请求排队,在服务端空闲的情况下逐个处理。用户最大等待时长为6小时 状态码: 400 表5 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表6 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息 状态码: 401 表7 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表8 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息 状态码: 403 表9 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表10 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息 状态码: 404 表11 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表12 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息 状态码: 409 表13 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表14 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息 状态码: 429 表15 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表16 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息 状态码: 500 表17 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表18 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 Client-Request-Id 是 String 用户指定的,对于此请求的唯一ID,用于定位某个请求,推荐使用UUID 最小长度:36 最大长度:128 表3 请求Body参数 参数 是否必选 参数类型 描述 execution_plan_id 否 String 执行计划(execution_plan)的唯一Id。 此Id由资源编排服务在生成执行计划的时候生成,为UUID。 由于执行计划名仅仅在同一时间下唯一,即用户允许先生成一个叫HelloWorld的执行计划,删除,再重新创建一个同名执行计划。 对于团队并行开发,用户可能希望确保,当前我操作的执行计划就是我认为的那个,而不是其他队友删除后创建的同名执行计划。因此,使用ID就可以做到强匹配。 资源编排服务保证每次创建的执行计划所对应的ID都不相同,更新不会影响ID。如果给予的execution_plan_id和当前执行计划的ID不一致,则返回400 注意: 创建执行计划后,资源编排服务持久化请求并立即返回,客户端不等待请求最终处理完成,用户无法实时感知请求处理结果 资源编排服务最终会将异步部署请求排队,在服务端空闲的情况下逐个处理。用户最大等待时长为1小时 最小长度:36 最大长度:36 stack_id 否 String 资源栈(stack)的唯一Id。 此Id由资源编排服务在生成资源栈的时候生成,为UUID。 由于资源栈名仅仅在同一时间下唯一,即用户允许先生成一个叫HelloWorld的资源栈,删除,再重新创建一个同名资源栈。 对于团队并行开发,用户可能希望确保,当前我操作的资源栈就是我认为的那个,而不是其他队友删除后创建的同名资源栈。因此,使用ID就可以做到强匹配。 资源编排服务保证每次创建的资源栈所对应的ID都不相同,更新不会影响ID。如果给予的stack_id和当前资源栈的ID不一致,则返回400 最小长度:36 最大长度:36
  • URI POST /v1/{project_id}/stacks/{stack_name}/execution-plans/{execution_plan_name} 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID,可以从调用API处获取,也可以从控制台获取。 项目ID获取方式 最小长度:3 最大长度:64 stack_name 是 String 资源栈的名称。此名字在domain_id+区域+project_id下应唯一,可以使用中文、大小写英文、数字、下划线、中划线。首字符需为中文或者英文,区分大小写。 最小长度:1 最大长度:128 execution_plan_name 是 String 执行计划的名称。此名字在domain_id+区域+project_id+stack_id下应唯一,可以使用中文、大小写英文、数字、下划线、中划线。首字符需为中文或者英文,区分大小写。 最小长度:1 最大长度:128
  • 功能介绍 执行执行计划(ApplyExecutionPlan) 此API用于执行一个执行计划 当执行请求接受后,执行计划状态将变为APPLY_IN_PROGRESS,后台会进行异步处理。 当执行结束后,执行计划状态将变为APPLIED。 用户可以调用GetStackMetadata查询资源栈的状态(status)来跟踪资源栈部署情况以及确认本次执行结果是否成功。 如果不希望通过执行计划进行部署操作,也可以选择调用DeployStack进行直接部署 关于执行计划的过期失效: 如果指定资源栈下有多个执行计划,则在执行某个执行计划后(无论结果是否成功),剩余所有的执行计划将过期失效; 如果调用ApplyExecutionPlan时,指定的执行计划已经过期失效,则返回403 如果资源栈状态处于非终态(即以IN_PROGRESS结尾,详细见下方)状态时,则不允许执行执行计划,并返回403。非终态状态包括但不限于以下状态: 正在部署(DEPLOYMENT_IN_PROGRESS) 正在删除(DELETION_IN_PROGRESS) 正在回滚(ROLLBACK_IN_PROGRESS)
  • 执行信息 在SQL调优过程中经常需要执行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看SQL语句实际执行信息,通过对比实际执行与优化器的估算之间的差别来为优化提供依据。EXPLAIN PERFORMANCE相对于EXPLAIN ANALYZE增加了每个DN上的执行信息。 以如下SQL语句为例: select count(1) from tb1; 执行EXPLAIN PERFORMANCE输出为: 图中显示执行信息分为以下7个部分 以表格的形式将计划显示出来,包含有11个字段,分别是:id、operation、A-time、A-rows、E-rows、E-distinct、Peak Memory、E-memory、A-width、E-width和E-costs。其中计划类字段(id、operation以及E开头字段)的含义与执行EXPLAIN时的含义一致,详见执行计划小节中的说明。A-time、A-rows、E-distinct、Peak Memory、A-width的含义说明如下: A-time:当前算子执行完成时间,一般DN上执行的算子的A-time是由[]括起来的两个值,分别表示此算子在所有DN上完成的最短时间和最长时间。 A-rows:表示当前算子的实际输出元组数。 E-distinct:表示hashjoin算子的distinct估计值。 Peak Memory:此算子在每个DN上执行时使用的内存峰值。 A-width:表示当前算子每行元组的实际宽度,仅对于重内存使用算子会显示,包括:(Vec)HashJoin、(Vec)HashAgg、(Vec) HashSetOp、(Vec)Sort、(Vec)Materialize算子等,其中(Vec)HashJoin计算的宽度是其右子树算子的宽度,会显示在其右子树上。 Predicate Information (identified by plan id): 这一部分主要显示的是静态信息,即在整个计划执行过程中不会变的信息,主要是一些join条件和一些filter信息。 Memory Information (identified by plan id): 这一部分显示的是整个计划中会将内存的使用情况打印出来的算子的内存使用信息,主要是Hash、Sort算子,包括算子峰值内存(peak memory),控制内存(control memory),估算内存使用(operator memory),执行时实际宽度(width),内存使用自动扩展次数(auto spread num),是否提前下盘(early spilled),以及下盘信息,包括重复下盘次数(spill Time(s)),内外表下盘分区数(inner/outer partition spill num),下盘文件数(temp file num),下盘数据量及最小和最大分区的下盘数据量(written disk IO [min, max] )。 Targetlist Information (identified by plan id) 这一部分显示的是每一个算子输出的目标列。 DataNode Information (identified by plan id): 这一部分会将各个算子的执行时间、CPU、buffer的使用情况全部打印出来。 User Define Profiling 这一部分显示的是CN和DN、DN和DN建连的时间,以及存储层的一些执行信息。 ====== Query Summary =====: 这一部分主要打印总的执行时间和网络流量,包括了各个DN上初始化和结束阶段的最大最小执行时间、CN上的初始化、执行、结束阶段的时间,以及当前语句执行时系统可用内存、语句估算内存等信息。 A-rows和E-rows的差异体现了优化器估算和实际执行的偏差度。一般来说,他们偏差越大,我们越可以认为优化器生成的计划的越不可信,人工干预调优的必要性越大。 A-time中的两个值偏差越大,表明此算子的计算偏斜(在不同DN上执行时间差异)越大,人工干预调优的必要性越大。 Max Query Peak Memory经常用来估算SQL语句耗费内存,也被用来作为SQL语句调优时运行态内存参数设置的重要依据。一般会以EXPLAIN ANALYZE或EXPLAIN PERFORMANCE的输出作为进一步调优的输入。
  • 执行计划 以如下SQL语句为例: 1 2 3 4 5 select cjxh, count(1) from dwcjk group by cjxh; 执行EXPLAIN的输出为: 执行计划字段解读(横向): id:执行算子节点编号。 operation:具体的执行节点算子名称。 Vector前缀的算子是指向量化执行引擎算子,一般出现含有列存表的Query中。 Streaming是一个特殊的算子,它实现了分布式架构的核心数据shuffle功能,Streaming共有三种形态,分别对应了分布式结构下不同的数据shuffle功能: Streaming (type: GATHER):作用是coordinator从DN收集数据。 Streaming(type: REDISTRIBUTE):作用是DN根据选定的列把数据重分布到所有的DN。 Streaming(type: BROADCAST):作用是把当前DN的数据广播给其他所有的DN E-rows:每个算子估算的输出行数。 E-memory:DN上每个算子估算的内存使用量,只有DN上执行的算子会显示。某些场景会在估算的内存使用量后使用括号显示该算子在内存资源充足下可以自动扩展的内存上限。 E-width:每个算子输出元组的估算宽度。 E-costs:每个算子估算的执行代价。 E-costs是优化器根据成本参数定义的单位来衡量的,习惯上以磁盘页面抓取为1个单位, 其它开销参数将参照它来设置。 每个节点的开销(E-costs值)包括它的所有子节点的开销。 开销只反映了优化器关心的东西,并没有把结果行传递给客户端的时间考虑进去。虽然这个时间可能在实际的总时间里占据相当重要的分量,但是被优化器忽略了,因为它无法通过修改规划来改变。 执行计划层级解读(纵向): 第一层: CS tore Scan on dwcjk 表扫描算子,用CStore Scan的方式扫描表dwcjk。这一层的作用是把表dwcjk的数据从buffer或者磁盘上读上来输送给上层节点参与计算。 第二层:Vector Hash Aggregate 聚合算子,作用是把下层计算输送上来的算子做聚合操作(group by)。 第三层:Vector Streaming (type: GATHER) Shuffle算子,此处GATHER类型的Shuffle算子作用是把数据从DN汇聚到CN。 第四层:Row Adapter 存储格式转化算子,主要作用是把内存中列式格式数据转为行式数据,以便客户端展示。 需要注意的是最顶层算子为Data Node Scan时,需要设置enable_fast_query_shipping为off才能看到具体的执行计划,如下面这个计划: 1 2 3 4 5 6 postgres=# explain select cjxh, count(1) from dwcjk group by cjxh; QUERY PLAN -------------------------------------------------- Data Node Scan (cost=0.00..0.00 rows=0 width=0) Node/s: All datanodes (2 rows) 设置enable_fast_query_shipping参数之后,执行计划显示如下: 执行计划中的关键字说明: 表访问方式 Seq Scan 全表顺序扫描。 Index Scan 优化器决定使用两步的规划:最底层的规划节点访问一个索引,找出匹配索引条件的行的位置,然后上层规划节点真实地从表中抓取出那些行。独立地抓取数据行比顺序地读取它们的开销高很多,但是因为并非所有表的页面都被访问了,这么做实际上仍然比一次顺序扫描开销要少。使用两层规划的原因是,上层规划节点在读取索引标识出来的行位置之前,会先将它们按照物理位置排序,这样可以最小化独立抓取的开销。 如果在WHERE里面使用的好几个字段上都有索引,那么优化器可能会使用索引的AND或OR的组合。但是这么做要求访问两个索引,因此与只使用一个索引,而把另外一个条件只当作过滤器相比,这个方法未必是更优。 索引扫描可以分为以下几类,他们之间的差异在于索引的排序机制。 Bitmap Index Scan 使用位图索引抓取数据页。 Index Scan using index_name 使用简单索引搜索,该方式按照索引键的顺序在索引表中抓取数据。该方式最常用于在大数据量表中只抓取少量数据的情况,或者通过ORDER BY条件匹配索引顺序的查询,以减少排序时间。 表连接方式 Nested Loop 嵌套循环,适用于被连接的数据子集较小的查询。在嵌套循环中,外表驱动内表,外表返回的每一行都要在内表中检索找到它匹配的行,因此整个查询返回的结果集不能太大(不能大于10000),要把返回子集较小的表作为外表,而且在内表的连接字段上建议要有索引。 (Sonic) Hash Join 哈希连接,适用于数据量大的表的连接方式。优化器使用两个表中较小的表,利用连接键在内存中建立hash表,然后扫描较大的表并探测散列,找到与散列匹配的行。Sonic和非Sonic的Hash Join的区别在于所使用hash表结构不同,不影响执行的结果集。 Merge Join 归并连接,通常情况下执行性能差于哈希连接。如果源数据已经被排序过,在执行融合连接时,并不需要再排序,此时融合连接的性能优于哈希连接。 运算符 sort 对结果集进行排序。 filter EXPLAIN输出显示WHERE子句当作一个"filter"条件附属于顺序扫描计划节点。这意味着规划节点为它扫描的每一行检查该条件,并且只输出符合条件的行。预计的输出行数降低了,因为有WHERE子句。不过,扫描仍将必须访问所有 10000 行,因此开销没有降低;实际上它还增加了一些(确切的说,通过10000 * cpu_operator_cost)以反映检查WHERE条件的额外CPU时间。 LIMIT LIMIT限定了执行结果的输出记录数。如果增加了LIMIT,那么不是所有的行都会被检索到。