自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 收藏
  • 关注

原创 in 子查询 or in 子查询改写

这里的in子查询+or+in子查询做成表达式,无法先过滤,这里in子查询里面的条件过滤性较好,可以利用索引先过滤,之前的文章中有提过or条件可以改写成union all,这里可以考虑改写成union all。or条件过滤性很好就比较适合做union all,这个例子也是对前面or关联案例的补充。这里能够很好的利用索引先过滤,性能提升几十倍。

2025-12-21 10:27:30 169

原创 like关联改写

1、 等价转换instr:字符串查找函数substr: 字符串截取函数LIKE:模糊匹配其三者之间的转换2、 问题语句这里问题在于驱动表为t2,index join次数100万次,前面说过与substr和instr可以等价转换,这里想要转换驱动表,那么就需要用substr。3、 改写这里与预期的一样驱动表变为t1表,index join次数降下来,另外注意的是,susbtr获取定长的情况下才做index join,因此这里结合业务可以知道是获取4个字节长度。

2025-12-14 18:11:52 294

原创 OR关联改写经验

or关联无论是把or拆分还是整体做,并不高效,在优化中我们一般是把or用union all去做等价替代。这里有几点要注意(1) 下面情况不等价commit;commit;commit;AA AA AAAA BB BBCC AA AA不等价于union all) t1AA AA AABB BB BBAA AA AA。

2025-12-07 21:25:30 729

原创 left join or的改写经验分享

tt2.id is null说明是要判断没有在tt2表里面的数据,而ll列重复数据较多,如果没有先过滤少量的数据再关联,中间结果集就会过多引起性能问题。根据前面的推断,先和过滤性较好的c2列关联减少关联数据量,再和ll列关联优化处理。)和(select ll from tt2 group by ll)减少了left join关联的左右表结果集,从而提升性能。原始语句问题在于tt.ll=t2.ll重复值很多,中间结果集tt1表数据量。tt2表数据量,因此想办法减少关联前左右表结果集数据量,这里(

2025-11-30 18:03:28 274

原创 LIKE CASE WHEN的改写思路(二)

因此要解决语句性能问题,就要解决case when这一部分问题。Case when作为条件判断,如果将每一分支做成一个集合,最后汇总结果集,可以用union all去实现。Like关联做成笛卡尔积,右表利用不上索引,每获取驱动表一条记录,都要到右表扫描state=1的结果集,扫描右表范围比较大,每次都要case when判断,性能消耗高。like case when一般是拆解处理,分支拆分,能够让其利用索引,原始语句wcode上是case when计算,所以无法使用索引造成性能耗时。

2025-11-23 12:11:25 180

原创 LIKE CASE WHEN的改写思路(一)

语句中的性能问题在于like case when做成笛卡尔积。case when用于条件判断,语句用业务角度理解,假设ll是层级的意思,第一(基层)层级就获取本级别的数据;第二层级有权限获取下级的数据,做like关联获取本级及下级数据。最终展示两个层级的所有数据,就是层级1+层级2数据,因此从这个角度分析可以用union all来改写。

2025-11-16 21:22:15 145

原创 update中set表关联和子查询改写经验分享

最近项目中遇到这样有趣的例子,原本是希望外面的where条件能过滤出少量数据然后再和set 里面的表关联获取少量数据,这里可以看到计划的第5行做成hash join,实际上没有达到我们预期的效果。这个计划和上面解释的一样符合我们的预期,外层tt2.c1条件过滤出少量的数据后下推给tt3.c3过滤出少量数据再和tt1表关联获取相关数据更新。一般情况下merge into处理表关联和子查询下推上更加高效。Merge into 中on (tt2.c1=t3.c1) 能够更好处理条件传递达到性能提升。

2025-11-09 18:32:07 246

原创 full join优化改写经验

语句中可以分析到t2表存储着使用记录,使用一次就记录一次,t1表是有效的设备信息,再根据业务需求分析,这里主要是要从有效的信息中获取未使用的设备信息,t1表总数是有效的,T2表中没有t1表使用记录的设备数据就是未使用的。那么整个需求主要依赖于t1表,t2表作用是获取未使用的记录。在项目中遇到这样的一个需求,从设备信息表和设备使用记录表中统计每个单位有效的设备信息和未被使用过的设备数量,开发商做成了full join方式,下面模拟一下场景,t1表是设备信息表,t2表是设备使用记录表,code是单位code。

2025-11-02 18:12:50 210

原创 列子查询与数字比较优化

我们可以把它具象化,t1表记录的是用户信息,c1是编号,t2表记录着打卡信息,早上打卡中午下班打卡,下午上班打卡,傍晚下班打卡,求出当前正常打卡人数。像语句这样子,对t2表全扫描与t1表进行关联求数据,性能优化更希望先过滤数据后少量数据进行关联。我们可以把逻辑重新调整,先把t2表打卡信息进行分组汇总后再与t1表关联获取数据。这里改写后计划有两个地方变化,首先是先过滤>=4的数据再关联,然后关联从hash join变成index join,相当于t2表变瘦后与t1表关联,这样一来关联计算减少从而性能提升。

2025-10-26 18:39:06 245

原创 标量子查询优化(三)

这个语句标量子查询查询的是test2表,主查询中又有test2表,且标量子查询中关联关系和主查询的test2进行关联,所不同的在于查询条件c4的值。整个语句需求逻辑:主查询test2表和test1表进行内连接筛选满足条件的,然后根据test2表的c4分类汇总c1列。主要是语句的逻辑上存在重复计算,解决的核心在于如何减少冗余计算,通过对语句逻辑理解,利用case when来处理。根据case when的理解,使用其可以根据c4表判断汇总c1列,从而消除标量子查询的计算。

2025-10-19 18:12:00 254

原创 标量子查询优化(二)

语句求count时,我们从left join的理解中可以知道,返回的是左表数据以及右表满足的数据,如果右表关联列没有重复值,数据量其实求的是左表的结果数据量,因此达梦数据库计划中直接去掉右表,而求左表的全部数据就是求counter,就迅速返回结果。语句的右表(select sum(c2) sumc2,c1 from t2 group by c1) t2与t1表关联的列是c1,已经做分组去重,是具有唯一性,求的是每组c1对应的c2总和(sum)相当于。标量子查询:子查询返回的是单一值的标量。

2025-10-12 22:36:53 372

原创 标量子查询优化之一

从语句中可以看到主查询查询的是标量子查询为0,就是计数为0的数据相当于t2不存在t3表的数据。语句表示不存在的语法是not exists,那么我们可以将语句改写成查t2不存在于t3表,然后和主查询关联。这里是从语句逻辑分析出发,用更优的方式去取得想要的数据。原语句中需要计算t3表所有数据,整体没有过滤性较好的条件,此时表关联查询会比标量子查询方式效率更高。最耗时在PRJT2,说明在查询项中,seq列是对应计划第9行,我们看看第9行是哪里的查询项,发现是t2表中的查询项,那么可以知道是标量子查询耗时。

2025-09-30 00:21:00 247

原创 多表关联查询-列子查询优化

于是我开始对语句进行解读,两张表进行关联,其中关联条件中出现and t2.id=(select top 1 id from t2 where t1.id=t2.b_id order by itime desc),这里面的t1.id=t2.b_id是t1和t2的关联关系,然后求t2的top 1 id,相当于每组的t2.b_id中获取第一个b_id,也就是分组去重,那就好办了,可以让t2表按b_id分组去重再与t1关联。改写思路就是先分组后关联,一次性分组去重后再和t1关联,从而大大减少计算量。

2025-09-24 21:35:10 208

原创 单表查询要点概述

前面大体上讲诉了单表查询的一些常规优化思路和改写。现做一个小结。

2025-09-14 17:47:41 219

原创 单表查询-having和where区别

在实际项目中,有时遇到上面的情况。像这类问题的优化处理原则:先过滤后分组。不用聚合函数过滤数据则用where。

2025-09-11 23:10:30 935

原创 单表查询-group by rollup优化

计划中可以看到对表扫描两次,而从结果中可以明白是对group by总计,那我们其实可以改写成将前面20行进行sum。我们有时候在项目上看到group by rollup用法,其实就是对group by分组进行合计。这里将temp做成临时表,然后只扫描表t1一次,达到优化效果。从计划中解读亦是如此,另外可以从结果上进行分析。第21行的count其实就是前面20行的总和。这里主要利用的优化思维就是减少扫描次数。

2025-08-31 23:57:41 212

原创 单表查询-分析函数的应用

这样的语句主查询越大,即(test0824表数据量越大)查询越慢,这里相当于每次主查询查出一条数据,就要和子查询比较a.score>b.score,子查询有多少条数据就比较多少次,实际上的效率就是主查询条数。最近遇到一个有趣的优化问题,本身的需求是统计每个人超过他自己分数的人数,并显示自身分数情况。这个需求到底是什么意思,实际上就是分数排名,这里我们可以用到rank()over()进行处理。(2)当拿到一个需求,应该合理分析需求,寻求更快地效率去实现,而非直译。排完序后减1就是计算超过分数的人数。

2025-08-24 22:09:08 352

原创 单表查询-模糊匹配

(1) 通配符在后面,如a like ‘L’||’%’,这种情况大部分是可以用索引去优化,打开LIKE_OPT_FLAG参数可以优化成a>=‘L’ AND a <‘M’。可以用LIKE ‘张%’去实现。通过例子验证,数据库在做模糊匹配的时候,尽量选择通配符在后面的情况,这样like匹配的效率更高。(3) 前后都有通配符,这种情况在匹配数据时候也是需要扫描全表数据后才能匹配到数据。(2) 通配符在前面,这种情况在匹配数据时候需要扫描全表数据后才能匹配到数据。1、使用like一般建议通配符在后。

2025-08-03 23:02:24 267

原创 单表查询-or优化

当我们遇到同一列or is null时,首先判断它是否可以过滤少量数据,可以的话就使用索引优化,另外optimizer_or_nbexp是or条件的优化参数。那其实它可以是任何值,或者可以不是任何值,所以它不能比较(=,<,>),对于缺失值可以用nvl赋予实际值便于比较计算。这不仅仅是数值上的0、布尔值上的false或字符串上的空字符串(“”),而是一种特殊的"空"状态。该语句or条件是同一列,但计划对表扫描两次,且可以看到使用索引后回表较大,这个计划的生成主要是受两个因素的影响。OR 表达式的优化方式。

2025-07-27 18:42:36 554

原创 单表查询-分页提前获取数据

大表分页查询优化思考

2025-07-21 23:40:13 365

原创 单表查询-counter的使用

对于where中只带有分区列,此时相当于查询分区子表的数据量,我们也是希望能够利用上counter来提升性能。这里可以看到,当开启counter属性时,执行计划时FAGR2,能够快速返回数据量。当我们开启counter维护表上的行数时,在做count时可以快速获取到表的数据量。在with counter情况下:alter table T1 with counter;达梦数据库中表上有个with counter属性,用来维护当前表内的行数。从下面的例子,我们可以真实感受一下counter优化的效果。

2025-07-20 21:32:43 404

原创 DM内存管理

DM内存简单介绍

2022-11-06 16:51:12 1451

原创 DM-设置定期收集统计信息作业

当你要根据表的变动情况进行统计信息的收集,可以设置定时作业进行收集。1.创建临时表--记录最大trxidcreate table trxid_jilu (OWNER VARCHAR2(20),TABLE_NAME VARCHAR2(20),trx_id int,table_cnt int,riqi date);--记录数据变化create table gather_tab (OWNER VARCHAR2(20),TABLE_NAME VARCHAR2(20),table_cnt...

2022-01-17 17:06:43 687

原创 DM数据库归档挖掘技术学习-DBMS_LOGMNR 包

归档挖掘修复数据

2022-01-17 10:17:19 851

原创 dmhs关于dm到mysql的搭建

1.环境准备(1)操作系统的用户权限 启动dmhs服务的操作系统用户最好是数据库的安装用户如果不能用数据库的安装用户,那么创建的dmhs服务用户必须要和数据库的安装用户在同一用户组中。(2)硬件需求 内存需求 DMHS 需要的内存总量取决于分析线程以及执行线程的并发数,最少需要 1G 内存。 磁盘需求 DMHS 安装文件占用 277M,包括了管理工具以及管理界面占用的空间,另外需要一些额外的空间存储 DMHS 运行的日...

2021-03-08 11:15:13 509

原创 关于国产数据库的归档那些事

什么是归档 数据库可以将联机日志文件保存到多个不同的位置,将联机日志转换为归档日志的过程称之为归档。相应的日志被称为归档日志。设置归档方法1:修改dm.ini的ARCH_INI=1配置dmarch.ini[ARCHIVE_LOCAL1]ARCH_TYPE = LOCAL ARCH_DEST = /home/dmdba/data/DSC/ARCH/DSC02/archARCH_FILE_SIZE = 128ARCH_SPACE_L...

2020-08-16 16:39:59 1345

原创 关于dm的水平分区表学习

1.创建range分区表语句示例:create table t3 (id int,name varchar(20),time datetime)partition by range(time)(partition p1 values less than ('2015-09-01'),partition p2 values less than ('2019-07-01'),...

2020-04-24 15:22:03 521

原创 CHECKPOINT

Select checkpoint(10);知识点:设置检查点 参数说明: rate:刷脏页百分比,取值范围:1~100 返回值: 检查点是否成功,0表示成功,非0表示失败 举例说明: 设置刷脏页百分比为30%的检查点 SELECT CHECKPOINT(30);checkpoint是一个内部事件,这个事件激活以后会触发数据库写进程(DBWR)将数据缓冲(DATABUFFER CAC...

2020-04-06 15:00:06 392

原创 静态游标

静态游标概念静态游标是只读游标,它总是按照打开游标时的原样显示结果集,在编译时就能确定静 态游标使用的查询。静态游标又分为两种:隐式游标和显式游标。1.隐式游标%FOUND:语句是否修改或查询到了记录,是返回TRUE,否则返回FALSE; %NOTFOUND:语句是否未能成功修改或查询到记录,是返回TRUE,否则返回 FALSE; %ISOPEN:游标是否打开。是返回...

2020-04-03 17:33:10 601

原创 达梦数据库常用函数之三

一、空值判断函数1.COALESCE(n1,n2,…,nx):返回其参数中第一个非空的值,如果所有参数均为NULL,则返回NULL。如果参数为多媒体数据类型,如TEXT类型,则系统会将TEXT类型先转换为VARCHAR 类型或VARBINARY类型,转换的最大长度为8188,超过部分将被截断。SELECT COALESCE(NULL,TIME '12:00:00',TIME '11:00...

2020-03-20 15:56:09 12493

原创 DM正则表达式

一、相关字符介绍REGEXP 函数是根据符合 POSIX 标准的正则表达式进行字符串匹配操作的系统函数, 是字符串处理函数的一种扩展。. :匹配除了换行符以外的单个字符。d.m可以匹配dameng。*:匹配前面的子表达式0次或多次。a*b可以匹配back。+:匹配前面的字符一次或者多次。a+可以匹配about。^:匹配行首。$:匹配行尾。[]:字符集,匹配任何括号间的字...

2020-03-20 11:36:18 7154

原创 DM日期时间函数

1.ADD_DAYS(data,n):返回日期 date加上相应天数n后的日期值。n可以是任意整数,date是日期类型(DATE)或时间戳类型(TIMESTAMP),返回值为日期类型(DATE)。select ADD_DAYS(date '2020-03-30',2);2.ADD_MONTHS(date,n):返回日期 date加上n个月的日期时间值。n可以是任意整数,date是日...

2020-03-19 16:04:33 17467

原创 DMTDD环境的搭建

本文内容主要是讲在DMTDD环境下,前端库是两个节点DSC的搭建过程。环境准备DMTDD主机及组件分配信息 实例名 IP地址 操作系统 备注 CSS0/CSS1 DSC0/DSC1 192.168.73.22 Redhat7.2 ...

2020-03-19 12:05:01 842

原创 达梦数据库DSC搭建

一、环境准备硬件:两台相同配置机器、2G 内存、20G 本地磁盘、2 块网卡操作系统:Red Hat Enterprise Linux Server release 7.2 (Maipo)数据库版本:disql V8.1-1-66-20.03.10-118926-ENT网络配置:DSC01:网卡1 192.168.73.* 网卡2 10.0.0.101DSC02:网卡1 19...

2020-03-17 14:38:24 1280

原创 达梦数据库常用函数之二

1.ASCII(char):返回char对应的ASCII的编码。select ASCII('B');2.BIT_LENGTH(char):返回char的位长度。3.CHAR(n)/CHR(n):返回数值n对应的字符,与ASCII()函数相反。select char(97);4.CHAR_LENGTH(char) /CHARACTER_LENGTH(char) ...

2020-03-17 11:07:31 11534 1

原创 DM数据库常用函数之一

1.ABS(n):返回n的绝对值;2.ACOS(n):返回n的反余弦值,n的取值-1到1;3.ASIN(n):返回n的反正弦值,n的取值-1到1;4.ATAN(n):返回n的反正切值;5.ATAN(n,m):返回n/m的反正切值;6.CEIL(n)/CEILING(n):返回大于等于n的最小整数; select ceil(15.67); ...

2020-03-15 11:43:02 3118

原创 达梦数据库物化视图的简单使用

一、概念 物化视图存储基表的数据,与视图不同的是,物化视图可以通过刷新来同步基表的数据。二、创建、修改物化视图 1.例子 create materialized view mv_test build immediate refresh force on demand with rowid enable query rewrite as selec...

2020-03-13 18:46:15 2450

原创 DM系统包学习之五—— DBMS_BINARY包

一、概要:这个包用来读写二进制流,二进制是机器能读懂的语言,然后转化成人类能读懂的语言。二、相关方法 1. BINARY_GET_CHAR 返回从二进制流VB中偏移OFFSET开始的一个CHAR类型数据。 语法:FUNCTION BINARY_GET_CHAR( VB VARBINARY, OFFSET INT ); 2.BI...

2020-03-13 17:46:36 417

原创 DMSQL的循环结构

一、LOOP语句 1.语法: LOOP 代码; END LOOP; 2.例子:create or replace procedure pro_loop(a int) asbeginloop if a<=0 then exit; end if; ...

2020-03-13 15:55:38 1365

原创 DM系统包学习之四—— DBMS_ALERT包

一、相关方法1. DBMS_ALERT.REGISTER 为当前会话注册一个预警事件,本操作会提交当前事务。 语法:DBMS_ALERT.REGISTER ( NAME IN VARCHAR(30) ) ; 说明:NAME 输入参数,预警事件名。2.DBMS_ALERT.REMOVE 删除当前会话的一个预警事件,如果该预警事件正在 DBMS_ALERT.WA...

2020-03-12 22:07:32 381

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除