云服务器内容精选

  • 请求示例 预估执行计划价格,该执行计划中包含了一个新创建的vpc资源 GET https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans/my_first_execution_plan/prices 预估执行计划价格,该执行计划中包含了一个新创建的vpc资源,并提供资源栈id和执行计划id以校验是否与当前资源栈和执行计划匹配 GET https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans/my_first_execution_plan/prices?stack_id=ea6a4f0e-ee8a-494e-b12a-8be4a1e65af2&execution_plan_id=fb5e781e-a27d-46e2-9954-242753857a9f
  • 响应示例 状态码: 200 询价成功 { "currency" : "CNY", "items" : [ { "resource_type" : "huaweicloud_vpc", "resource_name" : "vpc", "resource_price" : [ { "charge_mode" : "FREE", "discount" : 0, "original_price" : 0, "sale_price" : 0 } ], "supported" : true } ] }
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 currency String 币种,枚举值 CNY - 元,中国站返回的币种 items Array of ItemsResponse objects 执行计划中所有资源的询价结果 表5 ItemsResponse 参数 参数类型 描述 resource_type String 资源的类型 以HCL格式的模板为例,resource_type 为 huaweicloud_vpc resource "huaweicloud_vpc" "my_hello_world_vpc" { name = "test_vpc" } 以json格式的模板为例,resource_type 为 huaweicloud_vpc { "resource": { "huaweicloud_vpc": { "my_hello_world_vpc": { "name": "test_vpc" } } } } resource_name String 资源的名称,默认为资源的逻辑名称 以HCL格式的模板为例,resource_name 为 my_hello_world_vpc resource "huaweicloud_vpc" "my_hello_world_vpc" { name = "test_vpc" } 以json格式的模板为例,resource_name 为 my_hello_world_vpc { "resource": { "huaweicloud_vpc": { "my_hello_world_vpc": { "name": "test_vpc" } } } } index String 资源的索引,如果用户在模板中使用了count或for_each则会返回index。如果index出现,则resource_name + index可以作为该资源的一种标识 如果用户在模板中使用count,则index为从0开始的数字 以HCL格式的模板为例,用户在模板中可以通过huaweicloud_vpc.my_hello_world_vpc[0]和huaweicloud_vpc.my_hello_world_vpc[1]标识两个资源 resource "huaweicloud_vpc" "my_hello_world_vpc" { count = 2 name = "test_vpc" } 以json格式的模板为例,用户在模板中可以通过huaweicloud_vpc.my_hello_world_vpc[0]和huaweicloud_vpc.my_hello_world_vpc[1]标识两个资源 { "resource": { "huaweicloud_vpc": { "my_hello_world_vpc": { "name": "test_vpc", "count": 2 } } } } 如果用户在模板中使用for_each,则index为用户自定义的字符串 以HCL格式的模板为例,用户在模板中可以通过huaweicloud_vpc.my_hello_world_vpc["vpc1"]和huaweicloud_vpc.my_hello_world_vpc["vpc2"]标识两个资源 resource "huaweicloud_vpc" "my_hello_world_vpc" { for_each = { "vpc1" = "test_vpc" "vpc2" = "test_vpc" } name = each.value } 以json格式的模板为例,用户在模板中可以通过huaweicloud_vpc.my_hello_world_vpc["vpc1"]和huaweicloud_vpc.my_hello_world_vpc["vpc2"]标识两个资源 { "resource": { "huaweicloud_vpc": { "my_hello_world_vpc": { "for_each": { "vpc1": "test_vpc", "vpc2": "test_vpc" } "name": "${each.value}" } } } } module_address String 该资源的模块地址 supported Boolean 该资源或该资源当前所给予的参数是否支持进行询价 unsupported_message String 该资源不支持询价的具体原因 resource_price Array of ResourcePriceResponse objects 该资源的询价信息 如果该资源支持包周期计费或按需计费,或者该资源为免费资源,则返回该字段;如果该资源不支持询价,则不返回该字段。 表6 ResourcePriceResponse 参数 参数类型 描述 charge_mode String 计费模式 PRE_PAID - 包周期计费 POST_PAID - 按需计费 FREE - 免费 枚举值: PRE_PAID POST_PAID FREE sale_price Double 该资源最终优惠后的金额(只考虑官网折扣、商务折扣以及伙伴折扣,不包含促销折扣及优惠券),保留小数点后2位,向上取整,默认单位是元。 discount Double 该资源的总优惠额,保留小数点后2位,向上取整,默认单位是元。 original_price Double 该资源的原价,保留小数点后2位,向上取整,默认单位是元。 period_type String 计费单位 如果该资源支持包周期计费或按需计费,则会返回该字段;如果该资源为免费资源,则不返回该字段。 HOUR - 小时,按需计费的单位 DAY - 天,按需计费的单位 MONTH - 月,包周期计费的单位 YEAR - 年,包周期计费的单位 BYTE - 字节,按需计费的单位 MB - 百万字节,包周期计费和按需计费的单位 GB - 千兆字节,包周期计费和按需计费的单位 枚举值: HOUR DAY MONTH YEAR BYTE MB GB period_count Integer 该资源的计费数量,需要和period_type搭配使用 如果该资源支持包周期计费或按需计费,则会返回该字段;如果该资源为免费资源,则不返回该字段。 对于按需计费资源,此值默认返回1,代表在1个计费单位下,该资源的价格 对于包周期计费资源,此值与模板中该资源的period字段保持一致 状态码: 400 表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 响应消息 状态码: 401 表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 响应消息 状态码: 403 表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 响应消息 状态码: 404 表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 响应消息
  • URI GET /v1/{project_id}/stacks/{stack_name}/execution-plans/{execution_plan_name}/prices 表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 表2 Query参数 参数 是否必选 参数类型 描述 stack_id 否 String 资源栈(stack)的唯一Id。 此Id由 资源编排 服务在生成资源栈的时候生成,为UUID。 由于资源栈名仅仅在同一时间下唯一,即用户允许先生成一个叫HelloWorld的资源栈,删除,再重新创建一个同名资源栈。 对于团队并行开发,用户可能希望确保,当前我操作的资源栈就是我认为的那个,而不是其他队友删除后创建的同名资源栈。因此,使用ID就可以做到强匹配。 资源编排服务保证每次创建的资源栈所对应的ID都不相同,更新不会影响ID。如果给予的stack_id和当前资源栈的ID不一致,则返回400 最小长度:36 最大长度:36 execution_plan_id 否 String 执行计划(execution_plan)的唯一Id。 此Id由资源编排服务在生成执行计划的时候生成,为UUID。 由于执行计划名仅仅在同一时间下唯一,即用户允许先生成一个叫HelloWorld的执行计划,删除,再重新创建一个同名执行计划。 对于团队并行开发,用户可能希望确保,当前我操作的执行计划就是我认为的那个,而不是其他队友删除后创建的同名执行计划。因此,使用ID就可以做到强匹配。 资源编排服务保证每次创建的执行计划所对应的ID都不相同,更新不会影响ID。如果给予的execution_plan_id和当前执行计划的ID不一致,则返回400 最小长度:36 最大长度:36
  • 功能介绍 预估执行计划价格(EstimateExecutionPlanPrice) 此API可以基于一份已有的执行计划中增量的资源进行询价,当前支持询价的计费模式有包周期计费、按需计费、免费,暂不支持其他形式的计费模式,例如竞价计费模式等。 注: 由于某些资源的属性值含有默认值,且该属性和询价参数相关。如果用户的模板中描述的资源没有声明这些属性,则询价结果可能存在偏差。 询价结果仅为预估结果,具体请以实际为准。 如果用户在模板中使用了depends_on参数,如A资源询价必要字段依赖于B资源的创建,则A资源不支持询价。 暂不支持传入data sources的flavor.id的场景的询价。 暂不支持镜像询价。 如果A资源的询价必要字段设置了sensitive = true,则A资源不支持询价。 模板中询价的资源的个数是有限制的。当前一个模板中最多支持12个包周期计费资源和24个按需计费资源。 支持询价的资源列表和询价必要参数 huaweicloud_cce_cluster: 支持的计费模式:包周期、按需 huaweicloud_css_cluster: 支持的计费模式:按需 huaweicloud_evs_volume: 支持的计费模式:包周期、按需 询价必要参数:size(磁盘规格) huaweicloud_compute_instance: 支持的计费模式:包周期、按需 询价必要参数:flavor_id(规格ID)、flavor_name(规格名称,flavor_id和flavor_name至少给出一个)、system_disk_size(系统磁盘大小) huaweicloud_vpc_bandwidth: 支持的计费模式:按需 询价必要参数:charge_mode仅支持bandwidth huaweicloud_vpc_eip: 支持的计费模式:包周期、按需 询价必要参数:bandwidth.size(带宽大小) huaweicloud_gaussdb_redis_instance: 支持的计费模式:包周期、按需 huaweicloud_nat_gateway: 支持的计费模式:按需 huaweicloud_rds_instance: 支持的计费模式:包周期、按需 支持的数据库类型:MySQL、PostgreSQL、Microsoft SQL Server huaweicloud_sfs_turbo: 支持的计费模式:按需 询价必要参数:share_type(文件系统类型) huaweicloud_dms_kafka_instance: 支持的计费模式:按需 询价必要参数:flavor_id(规格ID)、product_id(产品ID。flavor_id和product_id至少给出一个。)、storage_space(存储容量) huaweicloud_dcs_instance: 支持的计费模式:包周期、按需 huaweicloud_gaussdb_mysql_instance: 支持的计费模式:包周期、按需 询价必要参数:proxy_node_number(代理节点数量)、volume_size(挂载卷的存储空间) huaweicloud_vpc: 支持的计费模式:免费 huaweicloud_drs_job: 支持的计费模式:按需 huaweicloud_apig_instance: 支持的计费模式:按需
  • 请求示例 删除指定资源栈下的执行计划 DELETE https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans/my_first_execution_plan 删除指定资源栈下的执行计划,并提供资源栈id和执行计划id以校验是否与当前资源栈和执行计划匹配 DELETE https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans/my_first_execution_plan?stack_id=ea6a4f0e-ee8a-494e-b12a-8be4a1e65af2&execution_plan_id=fb5e781e-a27d-46e2-9954-242753857a9f
  • 响应参数 状态码: 400 表4 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表5 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息 状态码: 401 表6 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表7 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息 状态码: 403 表8 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表9 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息 状态码: 404 表10 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表11 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息 状态码: 500 表12 响应Body参数 参数 参数类型 描述 error_code String 响应码 最小长度:11 最大长度:11 error_msg String 响应消息 encoded_authorization_message String 包含有关未经授权请求的信息。 details Array of Detail objects 权限拒绝时服务返回的详细错误信息。 表13 Detail 参数 参数类型 描述 error_code String 响应码 error_msg String 响应消息
  • URI DELETE /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 表2 Query参数 参数 是否必选 参数类型 描述 stack_id 否 String 资源栈(stack)的唯一Id。 此Id由资源编排服务在生成资源栈的时候生成,为UUID。 由于资源栈名仅仅在同一时间下唯一,即用户允许先生成一个叫HelloWorld的资源栈,删除,再重新创建一个同名资源栈。 对于团队并行开发,用户可能希望确保,当前我操作的资源栈就是我认为的那个,而不是其他队友删除后创建的同名资源栈。因此,使用ID就可以做到强匹配。 资源编排服务保证每次创建的资源栈所对应的ID都不相同,更新不会影响ID。如果给予的stack_id和当前资源栈的ID不一致,则返回400 最小长度:36 最大长度:36 execution_plan_id 否 String 执行计划(execution_plan)的唯一Id。 此Id由资源编排服务在生成执行计划的时候生成,为UUID。 由于执行计划名仅仅在同一时间下唯一,即用户允许先生成一个叫HelloWorld的执行计划,删除,再重新创建一个同名执行计划。 对于团队并行开发,用户可能希望确保,当前我操作的执行计划就是我认为的那个,而不是其他队友删除后创建的同名执行计划。因此,使用ID就可以做到强匹配。 资源编排服务保证每次创建的执行计划所对应的ID都不相同,更新不会影响ID。如果给予的execution_plan_id和当前执行计划的ID不一致,则返回400 最小长度:36 最大长度:36
  • 执行计划显示信息 除了设置不同的执行计划显示格式外,还可以通过不同的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查看执行计划及其实际的运行信息,以便更精准地定位问题原因。
  • 执行信息 在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,那么不是所有的行都会被检索到。
  • 执行计划显示信息 除了设置不同的执行计划显示格式外,还可以通过不同的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查看执行计划及其实际的运行信息,以便更精准地定位问题原因。