翼度科技»论坛 编程开发 mysql 查看内容

数仓实时场景下表行数估算不准确引起的的性能瓶颈问题案例

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
本文分享自华为云社区《GaussDB(DWS)性能调优:实时场景下表行数估算不准确引起的的性能瓶颈问题案例》,作者: O泡果奶~。
本文针对实时场景下SQL语句因表行数估算不准确而导致语句执行超时报错的案例进行分析。
1、【问题描述】

实时场景下,select查询语句执行时间过长,该语句verbose执行计划中存在nestloop,且使用hint(set (enable_index_nestloop off)) 无法生效。
2、【原始语句】
  1. select * from ( select
  2.         wo.work_order_id /*工单id*/,
  3.         wo.work_order_code /*工单编码*/,
  4.         wo.work_order_name /*工单名称*/,
  5.         wo.work_order_level /*工单层级(第一层级(未拆分工单/父工单):1,第二层级(子工单):10)*/,
  6.         decode(wo.work_order_level,1, '第一层级(未拆分工单/父工单)', 10,'第二层级(子工单)') as work_order_level_desc /*工单层级描述*/,
  7.         substrb(wo.wo_description, 1, 1000) as wo_description /*工单描述*/,
  8.         wo.wo_version /*工单版本号*/,
  9.         wo.wo_lifecycle_status /*生命周期标识:0:正常工单,-1: 已删除*/,
  10.         wo.business_id /*工单来源业务id*/,
  11.         wo.business_type /*工单来源业务类型(10:活动流工单 20:手工派单 30:拆单工单 40:临时mos工单 50:ihub工单 60:ipmo工单 70:wbs工单 80:ncs工单 90:hr工单 100:ls工单 默认10)*/,
  12.         decode( wo.business_type, '10', '活动流工单', '20', '手工派单', '30', '拆单工单', '40', '临时MOS工单', '50', 'ihub工单', '60',  'ipmo工单',
  13.                                           '70', 'WBS工单', '80', 'NCS工单', '90', 'HR工单', '100', 'LS工单' ) as business_type_desc /*工单来源业务类型描述*/,
  14.         wo.parent_activity_id /*父节点活动id*/,
  15.         wo.activity_lib_id /*活动库活动id*/,
  16.         wo.activity_type /*作业类型,1wbs,2活动,3里程碑*/,
  17.         ac.activity_name  /*活动名称*/,
  18.         ac.std_ms_code as standard_ms_code  /*标准里程碑编码*/,
  19.         wo.plan_id /*计划id*/,
  20.         wo.project_number as proj_num  /*项目编码*/,
  21.         wo.du_id  /*交付单元id*/,
  22.         wo.duration  /*工期*/,
  23.         wo.billing_flag /*开票标识:y-开票*/,
  24.         wo.na_flag  /*na标识*/,
  25.         wo.inv_flag   /*inv标识*/,
  26.         wo.master_flag   /*拆分标示,n:未拆分 ; y:已拆分*/,
  27.         wo.created_by as created_by_id  /*创建人user id*/,
  28.         u1.lname as created_by  /*创建人*/,
  29.         wo.creation_date   /*创建时间*/,
  30.         wo.last_updated_by as last_updated_by_id   /*最后更新人user id*/,
  31.         u2.lname as last_updated_by  /*最后更新人*/,
  32.         wo.last_update_date   /*最后更新时间*/,
  33.         wp.wo_progress_id  /*活动进度id*/,
  34.         wp.expect_start_date  /*预期开始日期*/,
  35.         wp.expect_end_date  /*预期结束日期*/,
  36.         wp.plan_start_time  /*计划开始时间*/,
  37.         wp.plan_end_time /*计划完成时间*/,
  38.         wp.actual_start_time  /*实际开始时间*/,
  39.         wp.actual_end_time  /*实际完成时间*/,
  40.         wp.close_time  /*活动关闭时间*/,
  41.         wp.completion_rate   /*完工比率(数值如 0.8666)*/,
  42.         to_char(substr(wp.remark, 1, 333)) as progress_description   /*进度备注信息*/,
  43.         wp.total_value  /*总值*/,
  44.         wp.accumulate_value  /*累计值*/,
  45.         wp.report_time  /*值反馈时间*/,
  46.         wp.total_plan_value  /*总计划值*/,
  47.         wp.ehs_risk  /*高危活动类型*/,
  48.         wp.delay_reason_id   /*延迟原因id*/,
  49.         substrb(ag.description, 1, 1000) as delay_reason_description  /*延迟原因描述*/,
  50.         wp.wo_status  /*活动状态  psc_lookup_item_t_3220 classify_code = 'WO_STATUS_CODE'*/,
  51.         l2.item_name as wo_status_desc /*活动状态描述*/,(
  52.           case
  53.             when lengthb(wp.approve_status) = 0 then null
  54.             else wp.approve_status
  55.           end
  56.         ) :: number as approve_status   /*审批状态  psc_lookup_item_t_3220 classify_code = 'WORK_ORDER_APPROVE_STATUS'*/,
  57.         l3.item_name as approve_status_desc   /*审批状态描述*/,
  58.         wp.par_workorder_doc_flag  /*父工单是否有交付件(y/n)*/,
  59.         wp.deliverables_complete   /*交付件上传状态 0:不涉及交付件 1:待上传交付件 2:交付件上传中,未上传完9:交付件已上传完*/,
  60.         wp.revenue_trigger_status   /*触发状态(0:未触发过  1:已触发   2:已触发,pc校验触发失败  3:pc触发成功)*/,
  61.         wp.billing_status   /*开票状态(空值:未触发过  1:已开票)*/,
  62.         wp.frozen_flag  /*冻结标识(y/n)*/,
  63.         wp.mr_frozen_flag   /*mr是否冻结站点要货通过更新实施计划刷新字段*/,
  64.         wp.mr_status  /*站点签状态 1未签收,2部分签收,3全部签收,10未签收,20部分签收,30全部签收,40部分超配置签收,50全部超配置签收  完工验状态 p:部分完成,f:全部完成*/,
  65.         wp.tool_flag  /*是否挂工具工单回写(y/n)*/,
  66.         wp.split_cp_flag   /*拆分施工计划标识 y已拆分 n未拆分*/,
  67.         wp.mos_data_source  /*站点签完工验状数据来源*/,
  68.         wo.template_id  /*模板id,例如活动流节点id*/,
  69.         tfn.task_flow_id  /*任务流id*/,
  70.         tfn.task_flow_node_id /*活动流节点id*/,
  71.         tfn.revenue_flag /*收入里程碑标识(y/n)*/,
  72.         tfn.on_site  /*是否现场*/,
  73.         nvl(l1.item_name, tfn.owner_type) as owner_type  /*责任方类型 客户/华为/分包商*/,
  74.         tfn.subcon
  75.         /*是否分包*/
  76.         /*产品域*/,case
  77.           when wo.enable_flag = 'Y'
  78.           and wp.enable_flag = 'Y'
  79.           and wo.wo_lifecycle_status = 0
  80.           and nvl(du.enable_flag, 'Y') = 'Y' then 'Y'
  81.           else 'N'
  82.         end as enable_flag   /*有效标识,y为有效n为失效*/,
  83.         'N' as del_flag  /*删除标识 y为已删除*/,
  84.         3 as data_center_id  /*数据中心id*/,
  85.         tf.task_flow_code   /*活动流编码 add by jwx528041 20200408*/,
  86.         tfn.task_flow_node_code  /*任务流节点编码 add by jwx528041 20200408*/,
  87.         tfn.task_flow_node_name  /*任务流节点名称 add by jwx528041 20200408*/,
  88.         tfn.task_flow_node_type  /*任务流节点类型 add by jwx528041 20200408*/,
  89.         tfn.enable_flag as flow_enable_flag  /*活动流有效标识 add by jwx528041 20200408*/,
  90.         wo.tenant_code   /*租户编码 add by jwx528041 20200408*/,
  91.         tfn.activity_id  /*活动流水号 add by jwx528041 20200408*/,
  92.         tfn.lead_time  /*持续时间  add by jwx528041 20200408*/,
  93.         wo.resource_id as wo_actual_owner_id   /*工单实际责任人id update by swx949890 202207*/,
  94.         wo.resource_name as wo_actual_owner  /*工单实际责任人 update by swx949890 202207*/,
  95.         wo.contractor_id as wo_actual_owner_contr_id  /*工单实际责任人分包商id update by swx949890 202207*/,
  96.         wo.contractor_name as wo_actual_owner_contr_name  /*工单实际责任人分包商名称 update by swx949890 202207*/,
  97.         nvl(l4.item_name, tfn.delivery_model) as delivery_model  /*工单交付模式 add by cwx613468 20200711*/,
  98.         tfn.on_line_site  /*是否上站 add by cwx613468 20200711*/,
  99.         u3.lname as dispatcher_user_name   /*调度人 add by cwx613468 20200711*/,
  100.         tfn.approve_level_qty  /*审批总层级 add by jwx528041 20200819*/,
  101.         tf.task_flow_name   /*活动流名称 add by jwx528041 20200819*/,
  102.         tf.task_flow_type   /*活动流类型 add by jwx528041 20200819*/,
  103.         wp.source_code   /*标识actual时间的修改来源,值为mobile标识从手机端回写 add by jwx528041 20200819*/,
  104.         wp.plan_updated_by   /*实际开始时间更新人user id add by jwx528041 20200819*/,
  105.         wp.plan_update_time  /*计划时间更新时间  add by jwx528041 20200819*/,
  106.         wp.dispatch_time  /*调度时间  add by jwx528041 20200819*/,
  107.         wp.first_actual_update_time   /*第一次实际开始时间填入时间  add by jwx528041 20200819*/,
  108.         wp.first_actual_end_time   /*第一次实际结束时间填入时间  add by jwx528041 20200819*/,
  109.         wp.first_actual_updated_by    /*第一次实际时间填入人user id add by jwx528041 20200819*/,
  110.         wp.actual_start_update_time   /*实际开始时间更新日期 add by jwx528041 20200819*/,
  111.         wp.actual_start_updated_by   /*实际开始时间更新人user id add by jwx528041 20200819*/,
  112.         wp.actual_time_source  /*实际完成时间更新来源 add by jwx528041 20200819*/,
  113.         wp.actual_end_update_time /*实际完成时间更新日期 add by jwx528041 20200819*/,
  114.         wp.actual_end_updated_by /*实际完成时间更新人user id add by jwx528041 20200819*/,
  115.         wp.revenue_trigger_failed_msg
  116.         /*收入触发失败原因 add by jwx528041 20200819*/,
  117.         ag.souce_type as delay_reason_souce_type  /*延迟原因数据来源:1、自定义 2、 add by jwx528041 20200819*/
  118.                  --,ras.tree_type    as wo_owner_tree_type    /*工单责任人项目树节点类型tree_type add by jwx528041 20200819*/
  119.                  ,
  120.         wo.tree_type as wo_owner_tree_type /*工单责任人项目树节点类型tree_type update by swx949890 202207*/,
  121.         dr.resouce_type as wo_owner_resouce_type /*工单责任人资源类型 add by jwx528041 20200819*/,
  122.         l5.item_name as wo_owner_resouce_type_desc /*工单责任人资源类型 add by jwx528041 20200819*/,
  123.         u4.w3_account as wo_owner_w3_account /*工单责任人w3账号  add by jwx528041 20200819*/,
  124.         rel.du_tf_rel_enable /*du与活动流关系有效性标识 y:有效 n:失效  add by lwx617215 20210116*/,
  125.         t.billing_sla /*sla*/,
  126.         t.billing_milestone /*开票里程碑*/,
  127.         tf.required_tools,
  128.         wp.active,
  129.         gp.plan_code,
  130.         gp.plan_name,
  131.         gp.template_plan_id
  132.       from
  133.         sdisd.ogg_wo_work_order_2_3220 wo
  134.         inner join sdisd.ogg_wo_progress_2_3220 wp on wo.work_order_id = wp.work_order_id
  135.         left join sdisd.ogg_wo_task_flow_node_br_3220 tfn on wo.template_id = tfn.task_flow_node_id
  136.         and nvl(wo.wo_version, 0) = case
  137.           when nvl(wo.wo_version, 0) > 0 then tfn.version
  138.           else tfn.wo_version
  139.         end
  140.         and wo.project_number = tfn.project_number
  141.         left join sdisd.ogg_sds_activity_t_br_3220 ac on wo.activity_lib_id = ac.activity_id
  142.         left join sdisd.ogg_sds_task_flow_t_br_3220 tf on tfn.task_flow_id = tf.task_flow_id
  143.         left join sdisd.ogg_du_release_t_br_3220 du
  144.         /*enable_flag新增有效du的判断 lwx617215 20210116*/
  145.         on wo.du_id = du.du_id
  146.         left join sdisd.ogg_gcc_plan_2_3220 gp --dwx1189869
  147.         on wo.plan_id = gp.plan_id
  148.         and gp.tenant_code = 'RolloutPlan'
  149.         and gp.parent_plan_id = -1
  150.         and gp.enable_flag = 'Y'
  151.         left join (
  152.           select
  153.             r.du_id,
  154.             r.task_flow_id,
  155.             /*du与活动流有效标识*/
  156.             case
  157.               when r.enable_flag = 'Y'
  158.               and publish_flag = 'P' then 'Y'
  159.               else 'N'
  160.             end as du_tf_rel_enable,
  161.             row_number() over(
  162.               partition by r.du_id,
  163.               r.task_flow_id
  164.               order by
  165.                 r.last_update_date desc
  166.             ) as rn
  167.           from
  168.             sdisd.ogg_rp_du_tf_release_3_3220 r
  169.         ) rel on wo.du_id = rel.du_id
  170.         and tfn.task_flow_id = rel.task_flow_id
  171.         and rel.rn = 1
  172.         left join sdisd.ogg_tpl_user_t_3220 u1 on wo.created_by = u1.user_id
  173.         left join sdisd.ogg_tpl_user_t_3220 u2 on wo.last_updated_by = u2.user_id
  174.         left join sdisd.ogg_tpl_user_t_3220 u3 on wp.dispatcher_user_id = u3.user_id
  175.         left join sdisd.ogg_sds_activity_gap_t_br_3220 ag on wp.delay_reason_id = ag.activity_gap_id
  176.         left join sdisd.ogg_tpl_lookup_item_t_3220 l1 on tfn.owner_type = l1.item_code
  177.         and l1.classify_code = 'SDS_TASK_OWNER_TYPE'
  178.         and l1.language = 'en_US'
  179.         left join sdisd.ogg_psc_lookup_item_t_3220 l2 on wp.wo_status = l2.item_code
  180.         and l2.classify_code = 'WO_STATUS_CODE'
  181.         and l2.language = 'en_US'
  182.         left join sdisd.ogg_psc_lookup_item_t_3220 l3 on wp.approve_status = l3.item_code
  183.         and l3.classify_code = 'WORK_ORDER_APPROVE_STATUS'
  184.         and l3.language = 'en_US'
  185.         left join sdisd.ogg_tpl_lookup_item_t_3220 l4 on tfn.delivery_model = l4.item_code
  186.         and l4.classify_code = 'SDS_TASK_ON_SITE'
  187.         and l4.language = 'en_US'
  188.         left join sdisd.ogg_pm_project_tree_node_3220 tn on wo.resource_id = tn.tree_id
  189.         left join sdisd.ogg_pm_delivery_resource_3220 dr on tn.resource_id = dr.resource_id
  190.         left join sdisd.ogg_tpl_user_t_3220 u4 on dr.user_id = u4.user_id
  191.         left join sdisd.ogg_tpl_lookup_item_t_3220 l5 on dr.resouce_type = l5.item_code
  192.         and l5.classify_code = 'PM_RESOURCE_TYPE'
  193.         and l5.language = 'zh_CN'
  194.         left join sdisd.ogg_sds_task_flow_node_br_3220 t on tfn.task_flow_node_id = t.task_flow_node_id
  195.       where
  196.         (
  197.           wo.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  198.           or wp.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  199.           or tfn.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  200.           or ag.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  201.         )
  202.   union all
  203.       select
  204.         wo.work_order_id
  205.         /*工单id*/,
  206.         wo.work_order_code
  207.         /*工单编码*/,
  208.         wo.work_order_name
  209.         /*工单名称*/,
  210.         wo.work_order_level
  211.         /*工单层级(第一层级(未拆分工单/父工单):1,第二层级(子工单):10)*/,
  212.         decode(
  213.           wo.work_order_level,
  214.           1,
  215.           '第一层级(未拆分工单/父工单)',
  216.           10,
  217.           '第二层级(子工单)'
  218.         ) as work_order_level_desc
  219.         /*工单层级描述*/,
  220.         substrb(wo.wo_description, 1, 1000) as wo_description
  221.         /*工单描述*/,
  222.         wo.wo_version
  223.         /*工单版本号*/,
  224.         wo.wo_lifecycle_status
  225.         /*生命周期标识:0:正常工单,-1: 已删除*/,
  226.         wo.business_id
  227.         /*工单来源业务id*/,
  228.         wo.business_type
  229.         /*工单来源业务类型(10:活动流工单 20:手工派单 30:拆单工单 40:临时mos工单 50:ihub工单 60:ipmo工单 70:wbs工单 80:ncs工单 90:hr工单 100:ls工单 默认10)*/,
  230.         decode(
  231.           wo.business_type,
  232.           '10',
  233.           '活动流工单',
  234.           '20',
  235.           '手工派单',
  236.           '30',
  237.           '拆单工单',
  238.           '40',
  239.           '临时MOS工单',
  240.           '50',
  241.           'ihub工单',
  242.           '60',
  243.           'ipmo工单',
  244.           '70',
  245.           'WBS工单',
  246.           '80',
  247.           'NCS工单',
  248.           '90',
  249.           'HR工单',
  250.           '100',
  251.           'LS工单'
  252.         ) as business_type_desc
  253.         /*工单来源业务类型描述*/,
  254.         wo.parent_activity_id
  255.         /*父节点活动id*/,
  256.         wo.activity_lib_id
  257.         /*活动库活动id*/,
  258.         wo.activity_type
  259.         /*作业类型,1wbs,2活动,3里程碑*/,
  260.         ac.activity_name
  261.         /*活动名称*/,
  262.         ac.std_ms_code as standard_ms_code
  263.         /*标准里程碑编码*/,
  264.         wo.plan_id
  265.         /*计划id*/,
  266.         wo.project_number as proj_num
  267.         /*项目编码*/,
  268.         wo.du_id
  269.         /*交付单元id*/,
  270.         wo.duration
  271.         /*工期*/,
  272.         wo.billing_flag
  273.         /*开票标识:y-开票*/,
  274.         wo.na_flag
  275.         /*na标识*/,
  276.         wo.inv_flag
  277.         /*inv标识*/,
  278.         wo.master_flag
  279.         /*拆分标示,n:未拆分 ; y:已拆分*/,
  280.         wo.created_by as created_by_id
  281.         /*创建人user id*/,
  282.         u1.lname as created_by
  283.         /*创建人*/,
  284.         wo.creation_date
  285.         /*创建时间*/,
  286.         wo.last_updated_by as last_updated_by_id
  287.         /*最后更新人user id*/,
  288.         u2.lname as last_updated_by
  289.         /*最后更新人*/,
  290.         wo.last_update_date
  291.         /*最后更新时间*/,
  292.         wp.wo_progress_id
  293.         /*活动进度id*/,
  294.         wp.expect_start_date
  295.         /*预期开始日期*/,
  296.         wp.expect_end_date
  297.         /*预期结束日期*/,
  298.         wp.plan_start_time
  299.         /*计划开始时间*/,
  300.         wp.plan_end_time
  301.         /*计划完成时间*/,
  302.         wp.actual_start_time
  303.         /*实际开始时间*/,
  304.         wp.actual_end_time
  305.         /*实际完成时间*/,
  306.         wp.close_time
  307.         /*活动关闭时间*/,
  308.         wp.completion_rate
  309.         /*完工比率(数值如 0.8666)*/,
  310.         to_char(substr(wp.remark, 1, 333)) as progress_description
  311.         /*进度备注信息*/,
  312.         wp.total_value
  313.         /*总值*/,
  314.         wp.accumulate_value
  315.         /*累计值*/,
  316.         wp.report_time
  317.         /*值反馈时间*/,
  318.         wp.total_plan_value
  319.         /*总计划值*/,
  320.         wp.ehs_risk
  321.         /*高危活动类型*/,
  322.         wp.delay_reason_id
  323.         /*延迟原因id*/,
  324.         substrb(ag.description, 1, 1000) as delay_reason_description
  325.         /*延迟原因描述*/,
  326.         wp.wo_status
  327.         /*活动状态  psc_lookup_item_t_3220 classify_code = 'WO_STATUS_CODE'*/,
  328.         l2.item_name as wo_status_desc
  329.         /*活动状态描述*/,(
  330.           case
  331.             when lengthb(wp.approve_status) = 0 then null
  332.             else wp.approve_status
  333.           end
  334.         ) :: number as approve_status
  335.         /*审批状态  psc_lookup_item_t_3220 classify_code = 'WORK_ORDER_APPROVE_STATUS'*/,
  336.         l3.item_name as approve_status_desc
  337.         /*审批状态描述*/,
  338.         wp.par_workorder_doc_flag
  339.         /*父工单是否有交付件(y/n)*/,
  340.         wp.deliverables_complete
  341.         /*交付件上传状态 0:不涉及交付件 1:待上传交付件 2:交付件上传中,未上传完9:交付件已上传完*/,
  342.         wp.revenue_trigger_status
  343.         /*触发状态(0:未触发过  1:已触发   2:已触发,pc校验触发失败  3:pc触发成功)*/,
  344.         wp.billing_status
  345.         /*开票状态(空值:未触发过  1:已开票)*/,
  346.         wp.frozen_flag
  347.         /*冻结标识(y/n)*/,
  348.         wp.mr_frozen_flag
  349.         /*mr是否冻结站点要货通过更新实施计划刷新字段*/,
  350.         wp.mr_status
  351.         /*站点签状态 1未签收,2部分签收,3全部签收,10未签收,20部分签收,30全部签收,40部分超配置签收,50全部超配置签收  完工验状态 p:部分完成,f:全部完成*/,
  352.         wp.tool_flag
  353.         /*是否挂工具工单回写(y/n)*/,
  354.         wp.split_cp_flag
  355.         /*拆分施工计划标识 y已拆分 n未拆分*/,
  356.         wp.mos_data_source
  357.         /*站点签完工验状数据来源*/,
  358.         wo.template_id
  359.         /*模板id,例如活动流节点id*/,
  360.         tfn.task_flow_id
  361.         /*任务流id*/,
  362.         tfn.task_flow_node_id
  363.         /*活动流节点id*/,
  364.         tfn.revenue_flag
  365.         /*收入里程碑标识(y/n)*/,
  366.         tfn.on_site
  367.         /*是否现场*/,
  368.         nvl(l1.item_name, tfn.owner_type) as owner_type
  369.         /*责任方类型 客户/华为/分包商*/,
  370.         tfn.subcon
  371.         /*是否分包*/
  372.         /*产品域*/,case
  373.           when wo.enable_flag = 'Y'
  374.           and wp.enable_flag = 'Y'
  375.           and wo.wo_lifecycle_status = 0
  376.           and nvl(du.enable_flag, 'Y') = 'Y' then 'Y'
  377.           else 'N'
  378.         end as enable_flag
  379.         /*有效标识,y为有效n为失效*/,
  380.         'N' as del_flag
  381.         /*删除标识 y为已删除*/,
  382.         4 as data_center_id
  383.         /*数据中心id*/,
  384.         tf.task_flow_code
  385.         /*活动流编码 add by jwx528041 20200408*/,
  386.         tfn.task_flow_node_code
  387.         /*任务流节点编码 add by jwx528041 20200408*/,
  388.         tfn.task_flow_node_name
  389.         /*任务流节点名称 add by jwx528041 20200408*/,
  390.         tfn.task_flow_node_type
  391.         /*任务流节点类型 add by jwx528041 20200408*/,
  392.         tfn.enable_flag as flow_enable_flag
  393.         /*活动流有效标识 add by jwx528041 20200408*/,
  394.         wo.tenant_code
  395.         /*租户编码 add by jwx528041 20200408*/,
  396.         tfn.activity_id
  397.         /*活动流水号 add by jwx528041 20200408*/,
  398.         tfn.lead_time
  399.         /*持续时间  add by jwx528041 20200408*/,
  400.         wo.resource_id as wo_actual_owner_id
  401.         /*工单实际责任人id update by swx949890 202207*/,
  402.         wo.resource_name as wo_actual_owner
  403.         /*工单实际责任人 update by swx949890 202207*/,
  404.         wo.contractor_id as wo_actual_owner_contr_id
  405.         /*工单实际责任人分包商id update by swx949890 202207*/,
  406.         wo.contractor_name as wo_actual_owner_contr_name
  407.         /*工单实际责任人分包商名称 update by swx949890 202207*/,
  408.         nvl(l4.item_name, tfn.delivery_model) as delivery_model
  409.         /*工单交付模式 add by cwx613468 20200711*/,
  410.         tfn.on_line_site
  411.         /*是否上站 add by cwx613468 20200711*/,
  412.         u3.lname as dispatcher_user_name
  413.         /*调度人 add by cwx613468 20200711*/,
  414.         tfn.approve_level_qty
  415.         /*审批总层级 add by jwx528041 20200819*/,
  416.         tf.task_flow_name
  417.         /*活动流名称 add by jwx528041 20200819*/,
  418.         tf.task_flow_type
  419.         /*活动流类型 add by jwx528041 20200819*/,
  420.         wp.source_code
  421.         /*标识actual时间的修改来源,值为mobile标识从手机端回写 add by jwx528041 20200819*/,
  422.         wp.plan_updated_by
  423.         /*实际开始时间更新人user id add by jwx528041 20200819*/,
  424.         wp.plan_update_time
  425.         /*计划时间更新时间  add by jwx528041 20200819*/,
  426.         wp.dispatch_time
  427.         /*调度时间  add by jwx528041 20200819*/,
  428.         wp.first_actual_update_time
  429.         /*第一次实际开始时间填入时间  add by jwx528041 20200819*/,
  430.         wp.first_actual_end_time
  431.         /*第一次实际结束时间填入时间  add by jwx528041 20200819*/,
  432.         wp.first_actual_updated_by
  433.         /*第一次实际时间填入人user id add by jwx528041 20200819*/,
  434.         wp.actual_start_update_time
  435.         /*实际开始时间更新日期 add by jwx528041 20200819*/,
  436.         wp.actual_start_updated_by
  437.         /*实际开始时间更新人user id add by jwx528041 20200819*/,
  438.         wp.actual_time_source
  439.         /*实际完成时间更新来源 add by jwx528041 20200819*/,
  440.         wp.actual_end_update_time
  441.         /*实际完成时间更新日期 add by jwx528041 20200819*/,
  442.         wp.actual_end_updated_by
  443.         /*实际完成时间更新人user id add by jwx528041 20200819*/,
  444.         wp.revenue_trigger_failed_msg
  445.         /*收入触发失败原因 add by jwx528041 20200819*/,
  446.         ag.souce_type as delay_reason_souce_type
  447.         /*延迟原因数据来源:1、自定义 2、 add by jwx528041 20200819*/
  448.         --,ras.tree_type    as wo_owner_tree_type    /*工单责任人项目树节点类型tree_type add by jwx528041 20200819*/
  449. ,
  450.         wo.tree_type as wo_owner_tree_type
  451.         /*工单责任人项目树节点类型tree_type update by swx949890 202207*/,
  452.         dr.resouce_type as wo_owner_resouce_type
  453.         /*工单责任人资源类型 add by jwx528041 20200819*/,
  454.         l5.item_name as wo_owner_resouce_type_desc
  455.         /*工单责任人资源类型 add by jwx528041 20200819*/,
  456.         u4.w3_account as wo_owner_w3_account
  457.         /*工单责任人w3账号  add by jwx528041 20200819*/,
  458.         rel.du_tf_rel_enable
  459.         /*du与活动流关系有效性标识 y:有效 n:失效  add by lwx617215 20210116*/,
  460.         t.billing_sla
  461.         /*sla*/,
  462.         t.billing_milestone
  463.         /*开票里程碑*/,
  464.         tf.required_tools,
  465.         wp.active,
  466.         gp.plan_code,
  467.         gp.plan_name,
  468.         gp.template_plan_id
  469.       from
  470.         sdisd.ogg_wo_work_order17_3220 wo
  471.         inner join sdisd.ogg_wo_progress17_3220 wp on wo.work_order_id = wp.work_order_id
  472.         left join sdisd.ogg_wo_task_flow_node_za_3220 tfn on wo.template_id = tfn.task_flow_node_id
  473.         and nvl(wo.wo_version, 0) = case
  474.           when nvl(wo.wo_version, 0) > 0 then tfn.version
  475.           else tfn.wo_version
  476.         end
  477.         and wo.project_number = tfn.project_number
  478.         left join sdisd.ogg_sds_activity_t_za_3220 ac on wo.activity_lib_id = ac.activity_id
  479.         left join sdisd.ogg_sds_task_flow_t_za_3220 tf on tfn.task_flow_id = tf.task_flow_id
  480.         left join sdisd.ogg_du_release_t_za_3220 du
  481.         /*enable_flag新增有效du的判断 lwx617215 20210116*/
  482.         on wo.du_id = du.du_id
  483.         left join sdisd.ogg_gcc_plan17_3220 gp --dwx1189869
  484.         on wo.plan_id = gp.plan_id
  485.         and gp.tenant_code = 'RolloutPlan'
  486.         and gp.parent_plan_id = -1
  487.         and gp.enable_flag = 'Y'
  488.         left join (
  489.           select
  490.             r.du_id,
  491.             r.task_flow_id,
  492.             /*du与活动流有效标识*/
  493.             case
  494.               when r.enable_flag = 'Y'
  495.               and publish_flag = 'P' then 'Y'
  496.               else 'N'
  497.             end as du_tf_rel_enable,
  498.             row_number() over(
  499.               partition by r.du_id,
  500.               r.task_flow_id
  501.               order by
  502.                 r.last_update_date desc
  503.             ) as rn
  504.           from
  505.             sdisd.ogg_rp_du_tf_release18_3220 r
  506.         ) rel on wo.du_id = rel.du_id
  507.         and tfn.task_flow_id = rel.task_flow_id
  508.         and rel.rn = 1
  509.         left join sdisd.ogg_tpl_user_t_3220 u1 on wo.created_by = u1.user_id
  510.         left join sdisd.ogg_tpl_user_t_3220 u2 on wo.last_updated_by = u2.user_id
  511.         left join sdisd.ogg_tpl_user_t_3220 u3 on wp.dispatcher_user_id = u3.user_id
  512.         left join sdisd.ogg_sds_activity_gap_t_za_3220 ag on wp.delay_reason_id = ag.activity_gap_id
  513.         left join sdisd.ogg_tpl_lookup_item_t_3220 l1 on tfn.owner_type = l1.item_code
  514.         and l1.classify_code = 'SDS_TASK_OWNER_TYPE'
  515.         and l1.language = 'en_US'
  516.         left join sdisd.ogg_psc_lookup_item_t_3220 l2 on wp.wo_status = l2.item_code
  517.         and l2.classify_code = 'WO_STATUS_CODE'
  518.         and l2.language = 'en_US'
  519.         left join sdisd.ogg_psc_lookup_item_t_3220 l3 on wp.approve_status = l3.item_code
  520.         and l3.classify_code = 'WORK_ORDER_APPROVE_STATUS'
  521.         and l3.language = 'en_US'
  522.         left join sdisd.ogg_tpl_lookup_item_t_3220 l4 on tfn.delivery_model = l4.item_code
  523.         and l4.classify_code = 'SDS_TASK_ON_SITE'
  524.         and l4.language = 'en_US'
  525.         left join sdisd.ogg_pm_project_tree_node_3220 tn on wo.resource_id = tn.tree_id
  526.         left join sdisd.ogg_pm_delivery_resource_3220 dr on tn.resource_id = dr.resource_id
  527.         left join sdisd.ogg_tpl_user_t_3220 u4 on dr.user_id = u4.user_id
  528.         left join sdisd.ogg_tpl_lookup_item_t_3220 l5 on dr.resouce_type = l5.item_code
  529.         and l5.classify_code = 'PM_RESOURCE_TYPE'
  530.         and l5.language = 'zh_CN'
  531.         left join sdisd.ogg_sds_task_flow_node_za_3220 t on tfn.task_flow_node_id = t.task_flow_node_id
  532.       where
  533.         (
  534.           wo.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  535.           or wp.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  536.           or tfn.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  537.           or ag.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  538.         ))  as t limit 10
复制代码
3、【性能分析】

优化前SQL语句执行时间达到3600s,超时自动报错,如下图所示:

可以看出(具体verbose执行计划如附件1所示),verbose执行计划中存在过多的NestLoop算子,一般情况下,该算子影响SQL语句执行性能,应该尽可能避免使用。通常可以利用语句
  1. set [global] (enable_index_nestloop off)
复制代码
来避免执行器走NestLoop算子。但有些场景下,该语句无法保证不使用NestLoop算子。因此,可以从另一方面入手解决这一问题,优化器因为对表估算不准确,故给出NestLoop算子的方案,可以利用tablescan这一hint对表进行全表扫描,以保证执行器走HashJoin算子而非NestLoop算子,从而提高语句执行性能。
注意:在使用tablescan这个hint时要保证NestLoop算子涉及到的表都要加上
优化后的SQL语句如下所示:
  1. select * from ( select/*+tablescan(wp) tablescan(wo) tablescan(du) tablescan(ac) tablescan(u3) tablescan(u1) tablescan(u2) tablescan(tn) tablescan(dr) tablescan(u4)
  2. tablescan(t)*/
  3.         wo.work_order_id /*工单id*/,
  4.         wo.work_order_code /*工单编码*/,
  5.         wo.work_order_name /*工单名称*/,
  6.         wo.work_order_level /*工单层级(第一层级(未拆分工单/父工单):1,第二层级(子工单):10)*/,
  7.         decode(wo.work_order_level,1, '第一层级(未拆分工单/父工单)', 10,'第二层级(子工单)') as work_order_level_desc /*工单层级描述*/,
  8.         substrb(wo.wo_description, 1, 1000) as wo_description /*工单描述*/,
  9.         wo.wo_version /*工单版本号*/,
  10.         wo.wo_lifecycle_status /*生命周期标识:0:正常工单,-1: 已删除*/,
  11.         wo.business_id /*工单来源业务id*/,
  12.         wo.business_type /*工单来源业务类型(10:活动流工单 20:手工派单 30:拆单工单 40:临时mos工单 50:ihub工单 60:ipmo工单 70:wbs工单 80:ncs工单 90:hr工单 100:ls工单 默认10)*/,
  13.         decode( wo.business_type, '10', '活动流工单', '20', '手工派单', '30', '拆单工单', '40', '临时MOS工单', '50', 'ihub工单', '60',  'ipmo工单',
  14.                                           '70', 'WBS工单', '80', 'NCS工单', '90', 'HR工单', '100', 'LS工单' ) as business_type_desc /*工单来源业务类型描述*/,
  15.         wo.parent_activity_id /*父节点活动id*/,
  16.         wo.activity_lib_id /*活动库活动id*/,
  17.         wo.activity_type /*作业类型,1wbs,2活动,3里程碑*/,
  18.         ac.activity_name  /*活动名称*/,
  19.         ac.std_ms_code as standard_ms_code  /*标准里程碑编码*/,
  20.         wo.plan_id /*计划id*/,
  21.         wo.project_number as proj_num  /*项目编码*/,
  22.         wo.du_id  /*交付单元id*/,
  23.         wo.duration  /*工期*/,
  24.         wo.billing_flag /*开票标识:y-开票*/,
  25.         wo.na_flag  /*na标识*/,
  26.         wo.inv_flag   /*inv标识*/,
  27.         wo.master_flag   /*拆分标示,n:未拆分 ; y:已拆分*/,
  28.         wo.created_by as created_by_id  /*创建人user id*/,
  29.         u1.lname as created_by  /*创建人*/,
  30.         wo.creation_date   /*创建时间*/,
  31.         wo.last_updated_by as last_updated_by_id   /*最后更新人user id*/,
  32.         u2.lname as last_updated_by  /*最后更新人*/,
  33.         wo.last_update_date   /*最后更新时间*/,
  34.         wp.wo_progress_id  /*活动进度id*/,
  35.         wp.expect_start_date  /*预期开始日期*/,
  36.         wp.expect_end_date  /*预期结束日期*/,
  37.         wp.plan_start_time  /*计划开始时间*/,
  38.         wp.plan_end_time /*计划完成时间*/,
  39.         wp.actual_start_time  /*实际开始时间*/,
  40.         wp.actual_end_time  /*实际完成时间*/,
  41.         wp.close_time  /*活动关闭时间*/,
  42.         wp.completion_rate   /*完工比率(数值如 0.8666)*/,
  43.         to_char(substr(wp.remark, 1, 333)) as progress_description   /*进度备注信息*/,
  44.         wp.total_value  /*总值*/,
  45.         wp.accumulate_value  /*累计值*/,
  46.         wp.report_time  /*值反馈时间*/,
  47.         wp.total_plan_value  /*总计划值*/,
  48.         wp.ehs_risk  /*高危活动类型*/,
  49.         wp.delay_reason_id   /*延迟原因id*/,
  50.         substrb(ag.description, 1, 1000) as delay_reason_description  /*延迟原因描述*/,
  51.         wp.wo_status  /*活动状态  psc_lookup_item_t_3220 classify_code = 'WO_STATUS_CODE'*/,
  52.         l2.item_name as wo_status_desc /*活动状态描述*/,(
  53.           case
  54.             when lengthb(wp.approve_status) = 0 then null
  55.             else wp.approve_status
  56.           end
  57.         ) :: number as approve_status   /*审批状态  psc_lookup_item_t_3220 classify_code = 'WORK_ORDER_APPROVE_STATUS'*/,
  58.         l3.item_name as approve_status_desc   /*审批状态描述*/,
  59.         wp.par_workorder_doc_flag  /*父工单是否有交付件(y/n)*/,
  60.         wp.deliverables_complete   /*交付件上传状态 0:不涉及交付件 1:待上传交付件 2:交付件上传中,未上传完9:交付件已上传完*/,
  61.         wp.revenue_trigger_status   /*触发状态(0:未触发过  1:已触发   2:已触发,pc校验触发失败  3:pc触发成功)*/,
  62.         wp.billing_status   /*开票状态(空值:未触发过  1:已开票)*/,
  63.         wp.frozen_flag  /*冻结标识(y/n)*/,
  64.         wp.mr_frozen_flag   /*mr是否冻结站点要货通过更新实施计划刷新字段*/,
  65.         wp.mr_status  /*站点签状态 1未签收,2部分签收,3全部签收,10未签收,20部分签收,30全部签收,40部分超配置签收,50全部超配置签收  完工验状态 p:部分完成,f:全部完成*/,
  66.         wp.tool_flag  /*是否挂工具工单回写(y/n)*/,
  67.         wp.split_cp_flag   /*拆分施工计划标识 y已拆分 n未拆分*/,
  68.         wp.mos_data_source  /*站点签完工验状数据来源*/,
  69.         wo.template_id  /*模板id,例如活动流节点id*/,
  70.         tfn.task_flow_id  /*任务流id*/,
  71.         tfn.task_flow_node_id /*活动流节点id*/,
  72.         tfn.revenue_flag /*收入里程碑标识(y/n)*/,
  73.         tfn.on_site  /*是否现场*/,
  74.         nvl(l1.item_name, tfn.owner_type) as owner_type  /*责任方类型 客户/华为/分包商*/,
  75.         tfn.subcon
  76.         /*是否分包*/
  77.         /*产品域*/,case
  78.           when wo.enable_flag = 'Y'
  79.           and wp.enable_flag = 'Y'
  80.           and wo.wo_lifecycle_status = 0
  81.           and nvl(du.enable_flag, 'Y') = 'Y' then 'Y'
  82.           else 'N'
  83.         end as enable_flag   /*有效标识,y为有效n为失效*/,
  84.         'N' as del_flag  /*删除标识 y为已删除*/,
  85.         3 as data_center_id  /*数据中心id*/,
  86.         tf.task_flow_code   /*活动流编码 add by jwx528041 20200408*/,
  87.         tfn.task_flow_node_code  /*任务流节点编码 add by jwx528041 20200408*/,
  88.         tfn.task_flow_node_name  /*任务流节点名称 add by jwx528041 20200408*/,
  89.         tfn.task_flow_node_type  /*任务流节点类型 add by jwx528041 20200408*/,
  90.         tfn.enable_flag as flow_enable_flag  /*活动流有效标识 add by jwx528041 20200408*/,
  91.         wo.tenant_code   /*租户编码 add by jwx528041 20200408*/,
  92.         tfn.activity_id  /*活动流水号 add by jwx528041 20200408*/,
  93.         tfn.lead_time  /*持续时间  add by jwx528041 20200408*/,
  94.         wo.resource_id as wo_actual_owner_id   /*工单实际责任人id update by swx949890 202207*/,
  95.         wo.resource_name as wo_actual_owner  /*工单实际责任人 update by swx949890 202207*/,
  96.         wo.contractor_id as wo_actual_owner_contr_id  /*工单实际责任人分包商id update by swx949890 202207*/,
  97.         wo.contractor_name as wo_actual_owner_contr_name  /*工单实际责任人分包商名称 update by swx949890 202207*/,
  98.         nvl(l4.item_name, tfn.delivery_model) as delivery_model  /*工单交付模式 add by cwx613468 20200711*/,
  99.         tfn.on_line_site  /*是否上站 add by cwx613468 20200711*/,
  100.         u3.lname as dispatcher_user_name   /*调度人 add by cwx613468 20200711*/,
  101.         tfn.approve_level_qty  /*审批总层级 add by jwx528041 20200819*/,
  102.         tf.task_flow_name   /*活动流名称 add by jwx528041 20200819*/,
  103.         tf.task_flow_type   /*活动流类型 add by jwx528041 20200819*/,
  104.         wp.source_code   /*标识actual时间的修改来源,值为mobile标识从手机端回写 add by jwx528041 20200819*/,
  105.         wp.plan_updated_by   /*实际开始时间更新人user id add by jwx528041 20200819*/,
  106.         wp.plan_update_time  /*计划时间更新时间  add by jwx528041 20200819*/,
  107.         wp.dispatch_time  /*调度时间  add by jwx528041 20200819*/,
  108.         wp.first_actual_update_time   /*第一次实际开始时间填入时间  add by jwx528041 20200819*/,
  109.         wp.first_actual_end_time   /*第一次实际结束时间填入时间  add by jwx528041 20200819*/,
  110.         wp.first_actual_updated_by    /*第一次实际时间填入人user id add by jwx528041 20200819*/,
  111.         wp.actual_start_update_time   /*实际开始时间更新日期 add by jwx528041 20200819*/,
  112.         wp.actual_start_updated_by   /*实际开始时间更新人user id add by jwx528041 20200819*/,
  113.         wp.actual_time_source  /*实际完成时间更新来源 add by jwx528041 20200819*/,
  114.         wp.actual_end_update_time /*实际完成时间更新日期 add by jwx528041 20200819*/,
  115.         wp.actual_end_updated_by /*实际完成时间更新人user id add by jwx528041 20200819*/,
  116.         wp.revenue_trigger_failed_msg
  117.         /*收入触发失败原因 add by jwx528041 20200819*/,
  118.         ag.souce_type as delay_reason_souce_type  /*延迟原因数据来源:1、自定义 2、 add by jwx528041 20200819*/
  119.                  --,ras.tree_type    as wo_owner_tree_type    /*工单责任人项目树节点类型tree_type add by jwx528041 20200819*/
  120.                  ,
  121.         wo.tree_type as wo_owner_tree_type /*工单责任人项目树节点类型tree_type update by swx949890 202207*/,
  122.         dr.resouce_type as wo_owner_resouce_type /*工单责任人资源类型 add by jwx528041 20200819*/,
  123.         l5.item_name as wo_owner_resouce_type_desc /*工单责任人资源类型 add by jwx528041 20200819*/,
  124.         u4.w3_account as wo_owner_w3_account /*工单责任人w3账号  add by jwx528041 20200819*/,
  125.         rel.du_tf_rel_enable /*du与活动流关系有效性标识 y:有效 n:失效  add by lwx617215 20210116*/,
  126.         t.billing_sla /*sla*/,
  127.         t.billing_milestone /*开票里程碑*/,
  128.         tf.required_tools,
  129.         wp.active,
  130.         gp.plan_code,
  131.         gp.plan_name,
  132.         gp.template_plan_id
  133.       from
  134.         sdisd.ogg_wo_work_order_2_3220 wo
  135.         inner join sdisd.ogg_wo_progress_2_3220 wp on wo.work_order_id = wp.work_order_id
  136.         left join sdisd.ogg_wo_task_flow_node_br_3220 tfn on wo.template_id = tfn.task_flow_node_id
  137.         and nvl(wo.wo_version, 0) = case
  138.           when nvl(wo.wo_version, 0) > 0 then tfn.version
  139.           else tfn.wo_version
  140.         end
  141.         and wo.project_number = tfn.project_number
  142.         left join sdisd.ogg_sds_activity_t_br_3220 ac on wo.activity_lib_id = ac.activity_id
  143.         left join sdisd.ogg_sds_task_flow_t_br_3220 tf on tfn.task_flow_id = tf.task_flow_id
  144.         left join sdisd.ogg_du_release_t_br_3220 du
  145.         /*enable_flag新增有效du的判断 lwx617215 20210116*/
  146.         on wo.du_id = du.du_id
  147.         left join sdisd.ogg_gcc_plan_2_3220 gp --dwx1189869
  148.         on wo.plan_id = gp.plan_id
  149.         and gp.tenant_code = 'RolloutPlan'
  150.         and gp.parent_plan_id = -1
  151.         and gp.enable_flag = 'Y'
  152.         left join (
  153.           select
  154.             r.du_id,
  155.             r.task_flow_id,
  156.             /*du与活动流有效标识*/
  157.             case
  158.               when r.enable_flag = 'Y'
  159.               and publish_flag = 'P' then 'Y'
  160.               else 'N'
  161.             end as du_tf_rel_enable,
  162.             row_number() over(
  163.               partition by r.du_id,
  164.               r.task_flow_id
  165.               order by
  166.                 r.last_update_date desc
  167.             ) as rn
  168.           from
  169.             sdisd.ogg_rp_du_tf_release_3_3220 r
  170.         ) rel on wo.du_id = rel.du_id
  171.         and tfn.task_flow_id = rel.task_flow_id
  172.         and rel.rn = 1
  173.         left join sdisd.ogg_tpl_user_t_3220 u1 on wo.created_by = u1.user_id
  174.         left join sdisd.ogg_tpl_user_t_3220 u2 on wo.last_updated_by = u2.user_id
  175.         left join sdisd.ogg_tpl_user_t_3220 u3 on wp.dispatcher_user_id = u3.user_id
  176.         left join sdisd.ogg_sds_activity_gap_t_br_3220 ag on wp.delay_reason_id = ag.activity_gap_id
  177.         left join sdisd.ogg_tpl_lookup_item_t_3220 l1 on tfn.owner_type = l1.item_code
  178.         and l1.classify_code = 'SDS_TASK_OWNER_TYPE'
  179.         and l1.language = 'en_US'
  180.         left join sdisd.ogg_psc_lookup_item_t_3220 l2 on wp.wo_status = l2.item_code
  181.         and l2.classify_code = 'WO_STATUS_CODE'
  182.         and l2.language = 'en_US'
  183.         left join sdisd.ogg_psc_lookup_item_t_3220 l3 on wp.approve_status = l3.item_code
  184.         and l3.classify_code = 'WORK_ORDER_APPROVE_STATUS'
  185.         and l3.language = 'en_US'
  186.         left join sdisd.ogg_tpl_lookup_item_t_3220 l4 on tfn.delivery_model = l4.item_code
  187.         and l4.classify_code = 'SDS_TASK_ON_SITE'
  188.         and l4.language = 'en_US'
  189.         left join sdisd.ogg_pm_project_tree_node_3220 tn on wo.resource_id = tn.tree_id
  190.         left join sdisd.ogg_pm_delivery_resource_3220 dr on tn.resource_id = dr.resource_id
  191.         left join sdisd.ogg_tpl_user_t_3220 u4 on dr.user_id = u4.user_id
  192.         left join sdisd.ogg_tpl_lookup_item_t_3220 l5 on dr.resouce_type = l5.item_code
  193.         and l5.classify_code = 'PM_RESOURCE_TYPE'
  194.         and l5.language = 'zh_CN'
  195.         left join sdisd.ogg_sds_task_flow_node_br_3220 t on tfn.task_flow_node_id = t.task_flow_node_id
  196.       where
  197.         (
  198.           wo.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  199.           or wp.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  200.           or tfn.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  201.           or ag.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  202.         )
  203.   union all
  204.       select
  205.         wo.work_order_id
  206.         /*工单id*/,
  207.         wo.work_order_code
  208.         /*工单编码*/,
  209.         wo.work_order_name
  210.         /*工单名称*/,
  211.         wo.work_order_level
  212.         /*工单层级(第一层级(未拆分工单/父工单):1,第二层级(子工单):10)*/,
  213.         decode(
  214.           wo.work_order_level,
  215.           1,
  216.           '第一层级(未拆分工单/父工单)',
  217.           10,
  218.           '第二层级(子工单)'
  219.         ) as work_order_level_desc
  220.         /*工单层级描述*/,
  221.         substrb(wo.wo_description, 1, 1000) as wo_description
  222.         /*工单描述*/,
  223.         wo.wo_version
  224.         /*工单版本号*/,
  225.         wo.wo_lifecycle_status
  226.         /*生命周期标识:0:正常工单,-1: 已删除*/,
  227.         wo.business_id
  228.         /*工单来源业务id*/,
  229.         wo.business_type
  230.         /*工单来源业务类型(10:活动流工单 20:手工派单 30:拆单工单 40:临时mos工单 50:ihub工单 60:ipmo工单 70:wbs工单 80:ncs工单 90:hr工单 100:ls工单 默认10)*/,
  231.         decode(
  232.           wo.business_type,
  233.           '10',
  234.           '活动流工单',
  235.           '20',
  236.           '手工派单',
  237.           '30',
  238.           '拆单工单',
  239.           '40',
  240.           '临时MOS工单',
  241.           '50',
  242.           'ihub工单',
  243.           '60',
  244.           'ipmo工单',
  245.           '70',
  246.           'WBS工单',
  247.           '80',
  248.           'NCS工单',
  249.           '90',
  250.           'HR工单',
  251.           '100',
  252.           'LS工单'
  253.         ) as business_type_desc
  254.         /*工单来源业务类型描述*/,
  255.         wo.parent_activity_id
  256.         /*父节点活动id*/,
  257.         wo.activity_lib_id
  258.         /*活动库活动id*/,
  259.         wo.activity_type
  260.         /*作业类型,1wbs,2活动,3里程碑*/,
  261.         ac.activity_name
  262.         /*活动名称*/,
  263.         ac.std_ms_code as standard_ms_code
  264.         /*标准里程碑编码*/,
  265.         wo.plan_id
  266.         /*计划id*/,
  267.         wo.project_number as proj_num
  268.         /*项目编码*/,
  269.         wo.du_id
  270.         /*交付单元id*/,
  271.         wo.duration
  272.         /*工期*/,
  273.         wo.billing_flag
  274.         /*开票标识:y-开票*/,
  275.         wo.na_flag
  276.         /*na标识*/,
  277.         wo.inv_flag
  278.         /*inv标识*/,
  279.         wo.master_flag
  280.         /*拆分标示,n:未拆分 ; y:已拆分*/,
  281.         wo.created_by as created_by_id
  282.         /*创建人user id*/,
  283.         u1.lname as created_by
  284.         /*创建人*/,
  285.         wo.creation_date
  286.         /*创建时间*/,
  287.         wo.last_updated_by as last_updated_by_id
  288.         /*最后更新人user id*/,
  289.         u2.lname as last_updated_by
  290.         /*最后更新人*/,
  291.         wo.last_update_date
  292.         /*最后更新时间*/,
  293.         wp.wo_progress_id
  294.         /*活动进度id*/,
  295.         wp.expect_start_date
  296.         /*预期开始日期*/,
  297.         wp.expect_end_date
  298.         /*预期结束日期*/,
  299.         wp.plan_start_time
  300.         /*计划开始时间*/,
  301.         wp.plan_end_time
  302.         /*计划完成时间*/,
  303.         wp.actual_start_time
  304.         /*实际开始时间*/,
  305.         wp.actual_end_time
  306.         /*实际完成时间*/,
  307.         wp.close_time
  308.         /*活动关闭时间*/,
  309.         wp.completion_rate
  310.         /*完工比率(数值如 0.8666)*/,
  311.         to_char(substr(wp.remark, 1, 333)) as progress_description
  312.         /*进度备注信息*/,
  313.         wp.total_value
  314.         /*总值*/,
  315.         wp.accumulate_value
  316.         /*累计值*/,
  317.         wp.report_time
  318.         /*值反馈时间*/,
  319.         wp.total_plan_value
  320.         /*总计划值*/,
  321.         wp.ehs_risk
  322.         /*高危活动类型*/,
  323.         wp.delay_reason_id
  324.         /*延迟原因id*/,
  325.         substrb(ag.description, 1, 1000) as delay_reason_description
  326.         /*延迟原因描述*/,
  327.         wp.wo_status
  328.         /*活动状态  psc_lookup_item_t_3220 classify_code = 'WO_STATUS_CODE'*/,
  329.         l2.item_name as wo_status_desc
  330.         /*活动状态描述*/,(
  331.           case
  332.             when lengthb(wp.approve_status) = 0 then null
  333.             else wp.approve_status
  334.           end
  335.         ) :: number as approve_status
  336.         /*审批状态  psc_lookup_item_t_3220 classify_code = 'WORK_ORDER_APPROVE_STATUS'*/,
  337.         l3.item_name as approve_status_desc
  338.         /*审批状态描述*/,
  339.         wp.par_workorder_doc_flag
  340.         /*父工单是否有交付件(y/n)*/,
  341.         wp.deliverables_complete
  342.         /*交付件上传状态 0:不涉及交付件 1:待上传交付件 2:交付件上传中,未上传完9:交付件已上传完*/,
  343.         wp.revenue_trigger_status
  344.         /*触发状态(0:未触发过  1:已触发   2:已触发,pc校验触发失败  3:pc触发成功)*/,
  345.         wp.billing_status
  346.         /*开票状态(空值:未触发过  1:已开票)*/,
  347.         wp.frozen_flag
  348.         /*冻结标识(y/n)*/,
  349.         wp.mr_frozen_flag
  350.         /*mr是否冻结站点要货通过更新实施计划刷新字段*/,
  351.         wp.mr_status
  352.         /*站点签状态 1未签收,2部分签收,3全部签收,10未签收,20部分签收,30全部签收,40部分超配置签收,50全部超配置签收  完工验状态 p:部分完成,f:全部完成*/,
  353.         wp.tool_flag
  354.         /*是否挂工具工单回写(y/n)*/,
  355.         wp.split_cp_flag
  356.         /*拆分施工计划标识 y已拆分 n未拆分*/,
  357.         wp.mos_data_source
  358.         /*站点签完工验状数据来源*/,
  359.         wo.template_id
  360.         /*模板id,例如活动流节点id*/,
  361.         tfn.task_flow_id
  362.         /*任务流id*/,
  363.         tfn.task_flow_node_id
  364.         /*活动流节点id*/,
  365.         tfn.revenue_flag
  366.         /*收入里程碑标识(y/n)*/,
  367.         tfn.on_site
  368.         /*是否现场*/,
  369.         nvl(l1.item_name, tfn.owner_type) as owner_type
  370.         /*责任方类型 客户/华为/分包商*/,
  371.         tfn.subcon
  372.         /*是否分包*/
  373.         /*产品域*/,case
  374.           when wo.enable_flag = 'Y'
  375.           and wp.enable_flag = 'Y'
  376.           and wo.wo_lifecycle_status = 0
  377.           and nvl(du.enable_flag, 'Y') = 'Y' then 'Y'
  378.           else 'N'
  379.         end as enable_flag
  380.         /*有效标识,y为有效n为失效*/,
  381.         'N' as del_flag
  382.         /*删除标识 y为已删除*/,
  383.         4 as data_center_id
  384.         /*数据中心id*/,
  385.         tf.task_flow_code
  386.         /*活动流编码 add by jwx528041 20200408*/,
  387.         tfn.task_flow_node_code
  388.         /*任务流节点编码 add by jwx528041 20200408*/,
  389.         tfn.task_flow_node_name
  390.         /*任务流节点名称 add by jwx528041 20200408*/,
  391.         tfn.task_flow_node_type
  392.         /*任务流节点类型 add by jwx528041 20200408*/,
  393.         tfn.enable_flag as flow_enable_flag
  394.         /*活动流有效标识 add by jwx528041 20200408*/,
  395.         wo.tenant_code
  396.         /*租户编码 add by jwx528041 20200408*/,
  397.         tfn.activity_id
  398.         /*活动流水号 add by jwx528041 20200408*/,
  399.         tfn.lead_time
  400.         /*持续时间  add by jwx528041 20200408*/,
  401.         wo.resource_id as wo_actual_owner_id
  402.         /*工单实际责任人id update by swx949890 202207*/,
  403.         wo.resource_name as wo_actual_owner
  404.         /*工单实际责任人 update by swx949890 202207*/,
  405.         wo.contractor_id as wo_actual_owner_contr_id
  406.         /*工单实际责任人分包商id update by swx949890 202207*/,
  407.         wo.contractor_name as wo_actual_owner_contr_name
  408.         /*工单实际责任人分包商名称 update by swx949890 202207*/,
  409.         nvl(l4.item_name, tfn.delivery_model) as delivery_model
  410.         /*工单交付模式 add by cwx613468 20200711*/,
  411.         tfn.on_line_site
  412.         /*是否上站 add by cwx613468 20200711*/,
  413.         u3.lname as dispatcher_user_name
  414.         /*调度人 add by cwx613468 20200711*/,
  415.         tfn.approve_level_qty
  416.         /*审批总层级 add by jwx528041 20200819*/,
  417.         tf.task_flow_name
  418.         /*活动流名称 add by jwx528041 20200819*/,
  419.         tf.task_flow_type
  420.         /*活动流类型 add by jwx528041 20200819*/,
  421.         wp.source_code
  422.         /*标识actual时间的修改来源,值为mobile标识从手机端回写 add by jwx528041 20200819*/,
  423.         wp.plan_updated_by
  424.         /*实际开始时间更新人user id add by jwx528041 20200819*/,
  425.         wp.plan_update_time
  426.         /*计划时间更新时间  add by jwx528041 20200819*/,
  427.         wp.dispatch_time
  428.         /*调度时间  add by jwx528041 20200819*/,
  429.         wp.first_actual_update_time
  430.         /*第一次实际开始时间填入时间  add by jwx528041 20200819*/,
  431.         wp.first_actual_end_time
  432.         /*第一次实际结束时间填入时间  add by jwx528041 20200819*/,
  433.         wp.first_actual_updated_by
  434.         /*第一次实际时间填入人user id add by jwx528041 20200819*/,
  435.         wp.actual_start_update_time
  436.         /*实际开始时间更新日期 add by jwx528041 20200819*/,
  437.         wp.actual_start_updated_by
  438.         /*实际开始时间更新人user id add by jwx528041 20200819*/,
  439.         wp.actual_time_source
  440.         /*实际完成时间更新来源 add by jwx528041 20200819*/,
  441.         wp.actual_end_update_time
  442.         /*实际完成时间更新日期 add by jwx528041 20200819*/,
  443.         wp.actual_end_updated_by
  444.         /*实际完成时间更新人user id add by jwx528041 20200819*/,
  445.         wp.revenue_trigger_failed_msg
  446.         /*收入触发失败原因 add by jwx528041 20200819*/,
  447.         ag.souce_type as delay_reason_souce_type
  448.         /*延迟原因数据来源:1、自定义 2、 add by jwx528041 20200819*/
  449.         --,ras.tree_type    as wo_owner_tree_type    /*工单责任人项目树节点类型tree_type add by jwx528041 20200819*/
  450. ,
  451.         wo.tree_type as wo_owner_tree_type
  452.         /*工单责任人项目树节点类型tree_type update by swx949890 202207*/,
  453.         dr.resouce_type as wo_owner_resouce_type
  454.         /*工单责任人资源类型 add by jwx528041 20200819*/,
  455.         l5.item_name as wo_owner_resouce_type_desc
  456.         /*工单责任人资源类型 add by jwx528041 20200819*/,
  457.         u4.w3_account as wo_owner_w3_account
  458.         /*工单责任人w3账号  add by jwx528041 20200819*/,
  459.         rel.du_tf_rel_enable
  460.         /*du与活动流关系有效性标识 y:有效 n:失效  add by lwx617215 20210116*/,
  461.         t.billing_sla
  462.         /*sla*/,
  463.         t.billing_milestone
  464.         /*开票里程碑*/,
  465.         tf.required_tools,
  466.         wp.active,
  467.         gp.plan_code,
  468.         gp.plan_name,
  469.         gp.template_plan_id
  470.       from
  471.         sdisd.ogg_wo_work_order17_3220 wo
  472.         inner join sdisd.ogg_wo_progress17_3220 wp on wo.work_order_id = wp.work_order_id
  473.         left join sdisd.ogg_wo_task_flow_node_za_3220 tfn on wo.template_id = tfn.task_flow_node_id
  474.         and nvl(wo.wo_version, 0) = case
  475.           when nvl(wo.wo_version, 0) > 0 then tfn.version
  476.           else tfn.wo_version
  477.         end
  478.         and wo.project_number = tfn.project_number
  479.         left join sdisd.ogg_sds_activity_t_za_3220 ac on wo.activity_lib_id = ac.activity_id
  480.         left join sdisd.ogg_sds_task_flow_t_za_3220 tf on tfn.task_flow_id = tf.task_flow_id
  481.         left join sdisd.ogg_du_release_t_za_3220 du
  482.         /*enable_flag新增有效du的判断 lwx617215 20210116*/
  483.         on wo.du_id = du.du_id
  484.         left join sdisd.ogg_gcc_plan17_3220 gp --dwx1189869
  485.         on wo.plan_id = gp.plan_id
  486.         and gp.tenant_code = 'RolloutPlan'
  487.         and gp.parent_plan_id = -1
  488.         and gp.enable_flag = 'Y'
  489.         left join (
  490.           select
  491.             r.du_id,
  492.             r.task_flow_id,
  493.             /*du与活动流有效标识*/
  494.             case
  495.               when r.enable_flag = 'Y'
  496.               and publish_flag = 'P' then 'Y'
  497.               else 'N'
  498.             end as du_tf_rel_enable,
  499.             row_number() over(
  500.               partition by r.du_id,
  501.               r.task_flow_id
  502.               order by
  503.                 r.last_update_date desc
  504.             ) as rn
  505.           from
  506.             sdisd.ogg_rp_du_tf_release18_3220 r
  507.         ) rel on wo.du_id = rel.du_id
  508.         and tfn.task_flow_id = rel.task_flow_id
  509.         and rel.rn = 1
  510.         left join sdisd.ogg_tpl_user_t_3220 u1 on wo.created_by = u1.user_id
  511.         left join sdisd.ogg_tpl_user_t_3220 u2 on wo.last_updated_by = u2.user_id
  512.         left join sdisd.ogg_tpl_user_t_3220 u3 on wp.dispatcher_user_id = u3.user_id
  513.         left join sdisd.ogg_sds_activity_gap_t_za_3220 ag on wp.delay_reason_id = ag.activity_gap_id
  514.         left join sdisd.ogg_tpl_lookup_item_t_3220 l1 on tfn.owner_type = l1.item_code
  515.         and l1.classify_code = 'SDS_TASK_OWNER_TYPE'
  516.         and l1.language = 'en_US'
  517.         left join sdisd.ogg_psc_lookup_item_t_3220 l2 on wp.wo_status = l2.item_code
  518.         and l2.classify_code = 'WO_STATUS_CODE'
  519.         and l2.language = 'en_US'
  520.         left join sdisd.ogg_psc_lookup_item_t_3220 l3 on wp.approve_status = l3.item_code
  521.         and l3.classify_code = 'WORK_ORDER_APPROVE_STATUS'
  522.         and l3.language = 'en_US'
  523.         left join sdisd.ogg_tpl_lookup_item_t_3220 l4 on tfn.delivery_model = l4.item_code
  524.         and l4.classify_code = 'SDS_TASK_ON_SITE'
  525.         and l4.language = 'en_US'
  526.         left join sdisd.ogg_pm_project_tree_node_3220 tn on wo.resource_id = tn.tree_id
  527.         left join sdisd.ogg_pm_delivery_resource_3220 dr on tn.resource_id = dr.resource_id
  528.         left join sdisd.ogg_tpl_user_t_3220 u4 on dr.user_id = u4.user_id
  529.         left join sdisd.ogg_tpl_lookup_item_t_3220 l5 on dr.resouce_type = l5.item_code
  530.         and l5.classify_code = 'PM_RESOURCE_TYPE'
  531.         and l5.language = 'zh_CN'
  532.         left join sdisd.ogg_sds_task_flow_node_za_3220 t on tfn.task_flow_node_id = t.task_flow_node_id
  533.       where
  534.         (
  535.           wo.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  536.           or wp.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  537.           or tfn.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  538.           or ag.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
  539.         ))  as t limit 10
复制代码
如下图所示,该语句执行时间降为27s+,提升了语句的执行性能。

具体的performance执行计划如附件2所示。
点击关注,第一时间了解华为云新鲜技术~
 

来源:https://www.cnblogs.com/huaweiyun/p/17784708.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具