SQL优化误用'append'案例一则

编辑手记:SQL是数据库系统的核心,因SQL问题引发的系统蝴蝶效应屡见不鲜,今天继续学习SQL优化的技巧

这是某客户关键系统的一个TOP SQL:

根据下图sqlhc获取的信息,该SQL平均每次插入不到一条记录,每半小时执行10万次左右。

为什么cpu时间消耗很少,大部分等待时间是application等待?

sqlhc里面也有交待:

这些wait class是application的具体等待事件是enq:TM - contention,也就是表锁。在AWR报告的TOP 10事件中,也出现了这个事件,而且占DB time的4.6%,可见一个SQL就对系统造成了较大的影响:

这个表锁是如何生成的?罪魁祸首就是SQL中使用的append Hint。

append的Hint一般使用在insert select语句,插入大量结果集的时候,采用直接路径(direct path)在表的高水位线以上直接写入数据。在没有commit之前,sql会一直持有表锁。这个Hint在数据仓库的SQL中使用较多,一次插入记录几十万以上,执行频率低。

但是,在本例OLTP系统中,频繁执行而且插入少量记录的SQL也使用了append的hint,造成的后果就是:

1、sql执行效率低,大量的表锁等待,并发越多等待越严重。

2、插入的表TF_B_OCS_BATDEAL,有大量的空间被浪费,每插入一条记录都会占用一个block。而且即使有大量记录被delete,这些高水位线以下的空闲块不会被重新使用。

解决方法

这种频繁执行,每次插入少量记录的情况,不能使用append,必须马上去掉这个hint。

补充: 并行DML开启时,默认启用append插入模式。

insert /*+ parallel(4) */ into xxx select ....

这个SQL默认并没有开启并行DML,只是后面的select部分使用了并行,这种情况没有使用append。

alter session enable parallel dml; --启用并行DML

insert /*+ parallel(4) */ into xxx select

这时就启用了并行DML,不加append的hint,默认也是append插入模式。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-05-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linyb极客之路

在Spring Boot中实现HTTP缓存

幸运的是,Java附带了第一个这些格式的预定义格式化程序。可以在下面找到将标题设置为当天结束的示例。

844
来自专栏WindCoder

网易MySQL微专业学习笔记(二)-Mysql数据对象

这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。

461
来自专栏小白鼠

分布式事务数据库事务CAP定理BASE理论分布式事务案例

断电了,该怎么处理?通过日志的方式!在执行事务的时候数据库首先会记录下这个事务的redo操作日志,然后才开始真正操作数据库,在操作之前首先会把日志文件写入磁盘,...

992
来自专栏L宝宝聊IT

MySQL架构组成、逻辑模块组成

Mysql逻辑结构可以看成是二层架构,第一层通常叫做SQL Layer,在mysql数据库系统处理底层数据之前的所有工作都在这一层完成的,包括权...

673
来自专栏Web项目聚集地

Javascript中的异步

642
来自专栏lzj_learn_note

Volley源码分析学习

2)根据SDK版本来创建HttpStack的实现,如果是2.3以上的,则使用基于HttpUrlConnection实现的HurlStack,反之,则利用Http...

756
来自专栏Kirito的技术分享

Spring中的XML schema扩展机制

很久没有写关于 Spring 的文章了,最近在系统梳理 Dubbo 代码的过程中发现了 XML schema 这个被遗漏的知识点。由于工作中使用 SpringB...

956
来自专栏非著名程序员

基于 RxJava2+Retrofit2 精心打造的 Android 基础框架 XSnow

XSnow ? 基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络、上传、下载、缓存、事件总线、权限管理、数据库、图片加载、UI模...

2457
来自专栏IT技术精选文摘

基于ZooKeeper的分布式Session实现

862
来自专栏Ken的杂谈

分布式ID生成器解决方案SnowflakeX

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领...

1532

扫码关注云+社区