文档章节

Oracle插入数据的一次优化(insert ,,,,select,,,,)

hnairdb
 hnairdb
发布于 2018/11/02 00:04
字数 1015
阅读 461
收藏 1

一次优化的谈论:

在QQ群中 又看到问如下sql插入为什么会这么慢?正好群里面有个优化大事顺便给我们上了一课,我就顺手记录一下。

大家的优化思路:

1、突然变慢的话, 你查询一下目前数据库 中正在经历的等待事件哈。

2、append hit   (这个可以)

3、并行 (生产不建议开并行,对性能消耗很大)

4、 MERGE INTO (MERGE INTO 最大的用处不在这边,  在那种业务,关联更新, 或者要么没有就插入,有就更新的业务。 merge  into 精妙之处在于 可以走两种执行计划。)

5、nologging  (思想可以,但是没有见过在insert 有这个)

最后的优化思路:

先找原因  在优化

 1  弄清楚是 insert 慢还是 select 慢。那个慢就搞那个   2 明显这个语句是在执行哈,  我们就可以通过 v$session 这个试图观察这个 sql 执行过程中的等待事件, 针对等待事件作出处理,  3 另外 session这个试图中也可以看到, 有没有被阻塞啊。    

 insert的时候呢, 你的undo 块多不多, 如果插入的数据量很大, 你比一次插50G的数据。。。  那完蛋了, 不好优化了, 你想啊, 你没事1个事物,插入50G的数据, 那还优化个, 呵呵。。 赶紧做 大事物切片去吧

比如, insert时候, 都被阻塞了。。   insert阻塞是很常见的, 这个不举例子了。以后说

比如 insert慢的时候呢,  你要维护啊, 维护索引造成巨大的开销呢? 典型的索引分裂。。。

那你赶紧去做,索引热点块,散热啊。。。

是的额,索引会导致DML慢

如果Select 慢,那就首先去看一下是否有标量子查询。标量子查询  需要改为外链接

看表数据量大小,找驱动表,建立索引

你看表, tem这个表, 看着像临时表啊, 是否有统计信息啊。因为临时表,如果没有统计信息的话,会动态采样的。

  但是我遇到好几个案例, 这个表就不能收集统计信息, 一收集, SQl就慢了。。

看下这个查询 用使用到B表的两个字段,这样我们可以考虑下是否在B表的两个字段创建索引,就是说用索引扫描代替 全表扫描, 减少数据扫描的总量还是可以的,那么问题来了,这个索引还怎么创建呢?

  index (B 表两个字段), 还是 index(B 表两个字段,0)?这里引深一下,索引不存储null值,那么为了避免null值索引失效的问题,我们一般会在要创建索引字段后面叫一个常量,比如create idx_id on t(id,0),不管id是否有null值,但是组合索引都不会存储null,这个索引就不会失效。

回到这个话题,如果 where A.OLDER_ID=B.OLDER_ID,那么 我们可以使用 index (B 表两个字段),因为等值关联不存在空值,如果是where A.OLDER_ID(+)=B.OLDER_ID,也可以使用 index (B 表两个字段),右连接可以确保 B表没有NULL值。如果是左连接A.OLDER_ID(+)=B.OLDER_ID(+),那么B表是有可能存在null值,所以必须的使用 index(B 表两个字段,0) 这种方式创建索引。

当然也可以在select 查询开多快alter session set db_file_multiblock_read_count=128;)

 

 比如, 到最后呢。 看等待事件, 比如多快读等待事件。

https://blog.csdn.net/daiqiulong2/article/details/81513084 优化大神的博客。

 

 

 

© 著作权归作者所有

下一篇: sqoop 基本使用
hnairdb
粉丝 23
博文 126
码字总数 124984
作品 0
深圳
数据库管理员
私信 提问
mysql插入数据后返回自增ID的方法

mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 方法一是使用lastinsertid ...

王小明123
2013/06/08
15K
0
insert all 语句 用法详解

INSERT ALL语句的一些使用技巧。 首先描述一下需求,其实要进行的操作很简单:从一张表取数据插入到另一张表中,插入的目标表做了一个应用系统级的日志表,也就是说在插入目标表的同时,还需...

underA
2013/03/25
197
0
JDBC读取新插入Oracle数据库Sequence值的5种方法

/公共代码:得到数据库连接 public Connection getConnection() throws Exception{ Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); Connection conn = DriverManager.ge......

菜头_
2015/10/15
54
0
mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey

mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的...

飞翼
2016/12/28
397
0
Oracle 笔记(九)、触发器

1、触发器一旦创建就会立刻生效,有时可能需要临时禁用触发器,最常见的原因就是涉及数据加载。 ALTER TRIGGER trigger_name [ENABLE | DISABLE]; 2、Oracle 触发器里两个重要的内存逻辑表 ...

qvodnet
2018/06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7 linuxdeployqt qt5.13.1 打包程序

原文链接:https://www.cnblogs.com/linuxAndMcu/p/11016322.html 一、简介 linuxdeployqt 是Linux下的qt打包工具,可以将应用程序使用的资源(如库,图形和插件)复制到二进制运行文件所在的...

shzwork
12分钟前
1
0
IDEA 配置Springboot项目热部署

实现的方式概述 注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟) File-Settings-C...

小强的进阶之路
22分钟前
4
0
免费数据分析工具:secsoso

前段时间思考了理想数据分析平台,之后我们根据这个思路开发了spl语言并提供了一个数据分析平台,这个平台主要用在搜索ES,数据库索引中的数据。但后来发现对文件的事后处理也是个非常重要的...

赛克蓝德
24分钟前
2
0
暗黑2不能正常启动?带你轻松使用WIN10运行游戏

暗黑破坏神2这款游戏由于年代比较久远,所以设置启动这方面与现在的大部分游戏有很大差距,由于当初完美运行暗黑2是当年使用最多的XP系统,在使用现在大多数玩家使用的WIN7到WIN10系统常会出...

太空堡垒185
29分钟前
3
0
maven项目对象模型(二)

1.4.4.传递性依赖 一个传递性依赖就是一个依赖的依赖。如果project-a依赖于project-b,而后者接着依赖于project-c,那么project-c就是被认为是project-a的传递性依赖。如果project-c依赖于p...

万建宁
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部