摘要:通常跑批加工场景下,都是大数量做关联操作,通常不建议使用索引。有些时候因为计划误判导致使用索引的可能会导致严重的性能问题。本文从一个典型的索引导致性能的场景重发,剖析此类问题的特征,定位方法和解决方法

本文分享自华为云社区《GaussDB(DWS)性能调优:indexscan导致的性能问题识别与优化 #【玩转PB级数仓GaussDB(DWS)】》,作者: 譡里个檔 。

通常跑批加工场景下,都是大数量做关联操作,通常不建议使用索引。有些时候因为计划误判导致使用索引的可能会导致严重的性能问题。本文从一个典型的索引导致性能的场景重发,剖析此类问题的特征,定位方法和解决方法。

1)在某局点POC测试时发现某SQL语句比较慢,原始SQL如下

WITH
/**
etl_116583_7960703_994644
**/
LOADABLE as (select "boq_rel_type_id","to_pu_id","to_version","cycle_id",
"part_offset_flag","to_boq_id","descr","from_contract_id",
"from_version","from_pu_id","ss_id","to_contract_id",
"from_boq_id","enable_flag","last_update_date"
from (SELECT /*+ PARALLEL(4)*/
BOQ_REL.FROM_BOQ_ID,
BOQ_REL.TO_BOQ_ID,
BOQ_REL.FROM_PU_ID,
BOQ_REL.TO_PU_ID,
BOQ_REL.PART_OFFSET_FLAG,
BOQ_REL.DESCR,
BOQ_REL.SS_ID,
BOQ_REL.CYCLE_ID,
NVL(BOQ_REL.FROM_VERSION, 'SNULL') FROM_VERSION,
NVL(BOQ_REL.TO_VERSION, 'SNULL') TO_VERSION,
BOQ_REL.LAST_UPDATE_DATE,
FROM_CON.CONTRACT_ID AS FROM_CONTRACT_ID,
TO_CON.CONTRACT_ID AS TO_CONTRACT_ID,
CLA.CLASS_ID AS BOQ_REL_TYPE_ID,
BOQ_REL.ENABLE_FLAG
FROM (SELECT A.FROM_BOQ_ID,
A.TO_BOQ_ID,
A.FROM_PU_ID,
A.TO_PU_ID,
A.FROM_CONTRACT_NUMBER,
A.TO_CONTRACT_NUMBER,
A.BOQ_REL_TYPE_CODE,
A.PART_OFFSET_FLAG,
A.DESCR,
A.SS_ID,
A.FROM_VERSION,
A.TO_VERSION,
A.LAST_UPDATE_DATE,
A.CYCLE_ID,
A.ENABLE_FLAG,
DECODE(A.SS_ID, 2820, 2600, A.SS_ID) SS_ID_TMP,
ROW_NUMBER() OVER(PARTITION BY FROM_BOQ_ID, TO_BOQ_ID, FROM_PU_ID, TO_PU_ID, FROM_CONTRACT_NUMBER, TO_CONTRACT_NUMBER, BOQ_REL_TYPE_CODE, FROM_VERSION, TO_VERSION
ORDER BY DECODE(A.SS_ID, 2820, 1, 2600, 2, 3)) RN
FROM LDB_MD_BOQ_REL A) BOQ_REL,
(SELECT CONTRACT_ID,
HW_CONTRACT_NUM,
SS_ID
FROM DWI_MD_CONTRACT
WHERE CONTRACT_ID IS NOT NULL
AND END_TIME = TO_DATE('4712-12-31', 'YYYY-MM-DD')) FROM_CON,
(SELECT CONTRACT_ID,
HW_CONTRACT_NUM,
SS_ID
FROM DWI_MD_CONTRACT
WHERE CONTRACT_ID IS NOT NULL
AND END_TIME = TO_DATE('4712-12-31', 'YYYY-MM-DD')) TO_CON,
(SELECT CLASS_ID,
CODE,
CLASS_TYPE_ID,
SS_ID
FROM DWI_MD_CLASS
WHERE CLASS_TYPE_ID = 193) CLA
WHERE BOQ_REL.RN = 1
AND BOQ_REL.FROM_CONTRACT_NUMBER = FROM_CON.HW_CONTRACT_NUM
AND BOQ_REL.SS_ID = FROM_CON.SS_ID
AND BOQ_REL.TO_CONTRACT_NUMBER = TO_CON.HW_CONTRACT_NUM
AND BOQ_REL.SS_ID = TO_CON.SS_ID
AND BOQ_REL.BOQ_REL_TYPE_CODE = CLA.CODE
AND BOQ_REL.SS_ID_TMP = CLA.SS_ID
) t
),
BEFORE_TARGET as (select "from_contract_id","from_pu_id","ss_id","from_boq_id","from_version","to_version",
"crt_cycle_id","to_pu_id","to_boq_id","del_flag","last_upd_cycle_id","last_update_date",
"descr","enable_flag","crt_job_instance_id","dq_improve_flag","upd_job_instance_id",
"to_contract_id","part_offset_flag","boq_rel_type_id"
from (SELECT /*+PARALLEL(4)*/
FROM_BOQ_ID,
TO_BOQ_ID,
FROM_PU_ID,
TO_PU_ID,
FROM_CONTRACT_ID,
TO_CONTRACT_ID,
BOQ_REL_TYPE_ID,
PART_OFFSET_FLAG,
DESCR,
SS_ID,
CRT_CYCLE_ID,
LAST_UPD_CYCLE_ID,
DEL_FLAG,
DQ_IMPROVE_FLAG,
CRT_JOB_INSTANCE_ID,
UPD_JOB_INSTANCE_ID,
NVL(FROM_VERSION, 'SNULL') FROM_VERSION,
NVL(TO_VERSION, 'SNULL') TO_VERSION,
LAST_UPDATE_DATE,
ENABLE_FLAG
FROM DWI_MD_BOQ_REL
) t
),
CDC as (select LOADABLE."ss_id",LOADABLE."from_version",LOADABLE."from_boq_id",
LOADABLE."part_offset_flag",LOADABLE."from_pu_id",
case when BEFORE_TARGET.BOQ_REL_TYPE_ID is null and BEFORE_TARGET.FROM_BOQ_ID is null
and BEFORE_TARGET.FROM_CONTRACT_ID is null and BEFORE_TARGET.FROM_PU_ID is null
and BEFORE_TARGET.FROM_VERSION is null
and BEFORE_TARGET.TO_BOQ_ID is null and BEFORE_TARGET.TO_CONTRACT_ID is null
and BEFORE_TARGET.TO_PU_ID is null and BEFORE_TARGET.TO_VERSION is null
then 1
else 3
end as "change_code",
LOADABLE."to_version",LOADABLE."boq_rel_type_id",
LOADABLE."from_contract_id",LOADABLE."to_contract_id",
LOADABLE."descr",LOADABLE."last_update_date",
LOADABLE."to_pu_id",LOADABLE."enable_flag",LOADABLE."cycle_id",
LOADABLE."to_boq_id"
from LOADABLE
left join BEFORE_TARGET on LOADABLE.BOQ_REL_TYPE_ID = BEFORE_TARGET.BOQ_REL_TYPE_ID
and LOADABLE.FROM_BOQ_ID = BEFORE_TARGET.FROM_BOQ_ID and LOADABLE.FROM_CONTRACT_ID = BEFORE_TARGET.FROM_CONTRACT_ID
and LOADABLE.FROM_PU_ID = BEFORE_TARGET.FROM_PU_ID and LOADABLE.FROM_VERSION = BEFORE_TARGET.FROM_VERSION
and LOADABLE.TO_BOQ_ID = BEFORE_TARGET.TO_BOQ_ID and LOADABLE.TO_CONTRACT_ID = BEFORE_TARGET.TO_CONTRACT_ID
and LOADABLE.TO_PU_ID = BEFORE_TARGET.TO_PU_ID and LOADABLE.TO_VERSION = BEFORE_TARGET.TO_VERSION
),
TFM_FILTER_DATA_TARGET_OUTPUT_U as (select CDC."to_pu_id",CDC."boq_rel_type_id",CDC."ss_id",
Current_Timestamp() as "dw_last_update_date",CDC."to_version",
CDC."from_version",20230104000000 as "last_upd_cycle_id",
CDC."from_contract_id",CDC."last_update_date",CDC."descr",
'N' as "del_flag",CDC."from_boq_id",CDC."to_boq_id",
CDC."enable_flag",CDC."from_pu_id",-1 as "upd_job_instance_id",
'N' as "dq_improve_flag",CDC."to_contract_id",
CDC."part_offset_flag"
from CDC where CDC.change_code=3
)
update DWI_MD_BOQ_REL TARGET_U
set "dq_improve_flag" = TFM_FILTER_DATA_TARGET_OUTPUT_U."dq_improve_flag",
"dw_last_update_date" = TFM_FILTER_DATA_TARGET_OUTPUT_U."dw_last_update_date",
"upd_job_instance_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."upd_job_instance_id",
"descr" = TFM_FILTER_DATA_TARGET_OUTPUT_U."descr",
"part_offset_flag" = TFM_FILTER_DATA_TARGET_OUTPUT_U."part_offset_flag",
"last_update_date" = TFM_FILTER_DATA_TARGET_OUTPUT_U."last_update_date",
"del_flag" = TFM_FILTER_DATA_TARGET_OUTPUT_U."del_flag",
"last_upd_cycle_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."last_upd_cycle_id",
"enable_flag" = TFM_FILTER_DATA_TARGET_OUTPUT_U."enable_flag",
"ss_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."ss_id"
from TFM_FILTER_DATA_TARGET_OUTPUT_U
where TARGET_U."boq_rel_type_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."boq_rel_type_id"
and TARGET_U."to_version" = TFM_FILTER_DATA_TARGET_OUTPUT_U."to_version"
and TARGET_U."to_version" = TFM_FILTER_DATA_TARGET_OUTPUT_U."to_version"
and TARGET_U."to_pu_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."to_pu_id"
and TARGET_U."to_pu_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."to_pu_id"
and TARGET_U."to_contract_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."to_contract_id"
and TARGET_U."to_contract_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."to_contract_id"
and TARGET_U."to_boq_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."to_boq_id"
and TARGET_U."to_boq_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."to_boq_id"
and TARGET_U."from_version" = TFM_FILTER_DATA_TARGET_OUTPUT_U."from_version"
and TARGET_U."from_version" = TFM_FILTER_DATA_TARGET_OUTPUT_U."from_version"
and TARGET_U."from_pu_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."from_pu_id"
and TARGET_U."from_pu_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."from_pu_id"
and TARGET_U."from_contract_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."from_contract_id"
and TARGET_U."from_contract_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."from_contract_id"
and TARGET_U."from_boq_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."from_boq_id"
and TARGET_U."from_boq_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."from_boq_id"
and TARGET_U."boq_rel_type_id" = TFM_FILTER_DATA_TARGET_OUTPUT_U."boq_rel_type_id"
;

2)查询此query的topSQL信息的warning字段,发现SQL自诊断信息中有索引相关告警信息。

3)查询此query的topSQL信息(如下图),分析历史执行信息,发现id=20的CStore Index Scan算子的耗时为90796.980ms,SQL执行总时长137135.658ms。CStore Index Scan算子的耗时占比为 66%

4)找到原始SQL语句,对查询语句中出现的表dwimd.dwi_md_contract 进行hint,强制其走顺序扫描,避免走indexscan(全量语句见附件)

5)对语句进行explain verbose,查看计划,发现计划符合预期(即表dwimd.dwi_md_contract走tablescan,对于列存表计划上显式为CStore Scan)

6)对语句执行EXPLAIN ANALYZE操作(即实际执行语句),查看实际执行时间如下,发现SQL语句性能提升近10倍。全量的执行信息见附件

点击关注,第一时间了解华为云新鲜技术~

GaussDB(DWS)性能调优:indexscan导致的性能问题识别与优化的更多相关文章

  1. [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析

    本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...

  2. JVM性能调优2:JVM性能调优参数整理

    序号 参数名 说明 JDK 默认值 使用过 1 JVM执行模式 2 -client-server 设置该JVM运行与Client 或者Server Hotspot模式,这两种模式从本质上来说是在JVM ...

  3. spark 性能调优(一) 性能调优的本质、spark资源使用原理、调优要点分析

    转载:http://www.cnblogs.com/jcchoiling/p/6440709.html 一.大数据性能调优的本质 编程的时候发现一个惊人的规律,软件是不存在的!所有编程高手级别的人无论 ...

  4. JVM性能调优(4) —— 性能调优工具

    前序文章: JVM性能调优(1) -- JVM内存模型和类加载运行机制 JVM性能调优(2) -- 垃圾回收器和回收策略 JVM性能调优(3) -- 内存分配和垃圾回收调优 一.JDK工具 先来看看有 ...

  5. MySql(九):MySQL性能调优——Schema设计的性能优化

    一.高效的模型设计 先了解下数据库设计的三大范式 第一范式:要求有主键,并且要求每一个字段原子性不可再分 第二范式:要求所有非主键字段完全依赖主键,不能产生部分依赖 第三范式:所有非主键字段和主键字段 ...

  6. 图灵学院Java架构师-VIP-【性能调优-Mysql索引数据结构详解与索引优化】

    最近报名了图灵学院的架构专题的付费课程,没有赶上6月份开课,中途加入的.错过了多线程的直播课程,只能看录播了

  7. 成为Java GC专家(5)—Java性能调优原则

    并不是每个程序都需要调优.如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能.然而,在程序调试完成之后,很难马上就满足它的性能需求,于是就有了调优这项工作.无论哪种编程语言,对应用程序 ...

  8. MySQL 性能调优之存储引擎

    原文:http://bbs.landingbj.com/t-0-246222-1.html        http://bbs.landingbj.com/t-0-245851-1.html MySQ ...

  9. 性能调优的本质、Spark资源使用原理和调优要点分析

    本课主题 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...

  10. hbase性能调优(1)

    hbase性能调优 标签: hbase 性能调优 | 发表时间:2014-05-17 15:10 | 作者:无尘道长 分享到: 出处:http://www.iteye.com 一.服务端调优 1.参数 ...

随机推荐

  1. 2023平台工程崭露头角,AI 带来新机遇与挑战

    在今年,平台工程正在迅速在 IT 企业中崭露头角,成为软件开发团队的必要实践.根据 CloudBees 发布的最新报告<2023年平台工程:快速采纳和影响>,83%的受访者已经完全实施了平 ...

  2. video.js 视频

    http://www.cnblogs.com/lechenging/p/3858181.html

  3. [学习笔记]TypeScript查缺补漏(二):类型与控制流分析

    @ 目录 类型约束 基本类型 联合类型 控制流分析 instanceof和typeof 类型守卫和窄化 typeof判断 instanceof判断 in判断 内建函数,或自定义函数 赋值 布尔运算 保 ...

  4. 【日常收支账本】【Day04】优化编辑动账记录的操作——QTableWidget单元格设置QComboBox控件

    一.项目地址 https://github.com/LinFeng-BingYi/DailyAccountBook 二.新增 1. 在表格中设置选项列表,让用户更快地编辑动账记录 1.1 功能详述 为 ...

  5. Spring5学习随笔-Spring5的第一个程序(环境搭建、日志框架整合)

    第二章.第一个Spring程序 1.软件版本 1.JDK1.8+ 2.Maven3.5+ 3.IDEA2018+ 4.SpringFramework 5.1.4 官网:www.spring.io 2. ...

  6. 牛客多校第一场 A. Alice and Bob (暴力SG)

    题目大概 有两堆石子,有两个人拿,一个人从一堆中拿\(k\)个,那么就必须从另一堆中拿\(s*k\)个,Alice先拿,问是否必赢. 解题: 数据不大,看到前\(20\)名队伍没有推结论做的..除了打 ...

  7. OpenAI宫斗反转反转再反转,到底是资本任性还是人性扭曲?

    最近OpenAI发生了一件大事,创始人山姆·奥特曼被董事会开除了,这在AI界引起了轩然大波. 事件经过 我们先来捋一下事件经过,时间以美国旧金山当地时间为准. 11月17日 11月17日12点(北京时 ...

  8. C#/.NET/.NET Core推荐学习书籍(已分类)

    前言 古人云:"书中自有黄金屋,书中自有颜如玉",说明了书籍的重要性.作为程序员,我们需要不断学习以提升自己的核心竞争力.以下是一些优秀的C#/.NET/.NET Core相关学习 ...

  9. uni-app学习笔记——路由与页面跳转

    小颖最近在学习小程序,怕自己前看后忘,毕竟还没开始进入项目实践中,就自己瞎倒腾嘻嘻,今天来看下  uni-app  的路由与页面跳转,小颖就简单列举下它们的用法,具体的大家可以看官网哦!啦啦啦啦啦  ...

  10. [JDK/APM] 应用诊断工具之VisualVM

    1 概述 1.1 简介 VisualVM is a visual tool integrating commandline JDK tools and lightweight profiling ca ...