关于加快INSERT语句执行速度和HINT /*+ append */及/*+ append nologging */的使用
(非归档模式下)创建表T01:
SQL> create table t01 as select * from dba_objects where 1=2;
Table created.
(非归档模式下)查看当前redo大小:
SQL> select value
2 from v$mystat,v$statname
3 where v$mystat.statistic#=v$statname.statistic#
4 and v$statname.name='redo size'
5 /
VALUE
----------
49784
(非归档模式下)普通INSERT语句插入:
SQL> insert into t01 select * from dba_objects;
11698 rows created.
(非归档模式下)查看普通INSERT语句执行后,当前redo大小:
SQL> select value
from v$mystat,v$statname
2 3 where v$mystat.statistic#=v$statname.statistic#
4 and v$statname.name='redo size';
VALUE
----------
1305724
(非归档模式)采用HINT /*+ append*/执行INSERT语句:
SQL> insert /*+ append */ into t01 select * from dba_objects;
11698 rows created.
(非归档模式)查询带/*+ append*/的INSERT执行后,当前redo大小:
SQL> select value
2 from v$mystat,v$statname
3 where v$mystat.statistic#=v$statname.statistic#
4 and v$statname.name='redo size';
VALUE
----------
1308140
(非归档模式)计算使用HINT(/*+ append*/)和普通INSERT语句分别产生的redo大小:
SQL> select (1308140-1305724) redo_append,(1305724-49784) redo from dual;
REDO_APPEND REDO
----------- ----------
2416 1255940
可见,在非归档模式下,INSERT语句采用HINT /*+ APPEND*/的方式确实比普通INSERT语句产生的redo要少很多。
=========================================
下面测试归档模式下
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/arch
Oldest online log sequence 109
Next log sequence to archive 111
Current log sequence 111
(归档模式)查看当前redo大小:
SQL> select value
2 from v$mystat,v$statname
3 where v$mystat.statistic#=v$statname.statistic#
4 and v$statname.name='redo size'
5 /
VALUE
----------
19540
(归档模式)执行普通INSERT语句:
SQL> insert into t01 select * from dba_objects;
11698 rows created.
(归档模式)普通INSERT方式产生的redo大小:
SQL> select value
2 from v$mystat,v$statname
3 where v$mystat.statistic#=v$statname.statistic#
4 and v$statname.name='redo size'
5 /
VALUE
----------
1218884
(归档模式)采用HINT /*+ append*/执行INSERT语句:
SQL> insert /*+ append */ into t01 select * from dba_objects;
11698 rows created.
(归档模式)查询带/*+ append*/的INSERT执行后,当前redo大小:
SQL> select value
2 from v$mystat,v$statname
3 where v$mystat.statistic#=v$statname.statistic#
4 and v$statname.name='redo size';
VALUE
----------
2451664
(归档模式)计算使用HINT(/*+ append*/)和普通INSERT语句分别产生的redo大小:
SQL> select (2451664-1218884) redo_append,(1218884-19540) from dual;
REDO_APPEND (1218884-19540)
----------- ---------------
1232780 1199344
可见,在归档模式下,采用HINT与普通INSERT方式产生的redo量是相当的,且略大于普通INSERT语句产生的redo量。
=========================================
再看一种情况,归档模式,T01也是LOGGING模式
SQL> select value
2 from v$mystat,v$statname
3 where v$mystat.statistic#=v$statname.statistic#
4 and v$statname.name='redo size'
5 /
VALUE
----------
2541780
SQL> insert /*+ append nologging */ into t01 select * from dba_objects;
或者执行:
SQL> insert /*+ append */ into t01 nologging select * from dba_objects;
也将产生redo的量为:1233040。
=========================================
最后一种情况:
(归档模式)修改T01的属性为NOLOGGING:
SQL> alter table t01 nologging;
Table altered.
SQL> select table_name,logging from dba_tables where table_name='T01';
TABLE_NAME LOG
------------------------------ ---
T01 NO
(归档模式)查看当前redo值:
SQL> select value
2 from v$mystat,v$statname
3 where v$mystat.statistic#=v$statname.statistic#
4 and v$statname.name='redo size'
5 /
VALUE
----------
5010600
(归档模式)执行普通INSERT语句:
SQL> insert into t01 select * from dba_objects;
11698 rows created.
SQL> select value
2 from v$mystat,v$statname
3 where v$mystat.statistic#=v$statname.statistic#
4 and v$statname.name='redo size'
5 /
VALUE
----------
6209848
(归档模式)采用HINT /*+ append*/执行INSERT语句:
SQL> insert /*+ append */ into t01 select * from dba_objects;
11698 rows created.
SQL> select value
2 from v$mystat,v$statname
3 where v$mystat.statistic#=v$statname.statistic#
4 and v$statname.name='redo size'
5 /
VALUE
----------
6210536
(归档模式)计算两者产生的redo差值:
SQL> select (6210536-6209848) redo_append,(6209848-5010600) redo from dual;
REDO_APPEND REDO
----------- ----------
688 1199248
可见,在归档模式下,将表调整为NOLOGGING,产生的redo量是最少的!
对比一下:
非归档,T01(LOGGING),普通INSERT语句产生的redo值:1255940
非归档,T01(LOGGING),HINT /*+append*/,产生的redo值:2416
归档,T01(LOGGING),普通INSERT语句产生的redo值:1199344
归档,T01(LOGGING), HINT /*+ append*/,产生的redo值:1232780
归档,T01(LOGGING),/*+append*/ + nologging,产生的redo值:1233040
归档,T01(NOLOGGING),普通INSERT语句产生的redo值:688
归档,T01(NOLOGGING),HINT /*+append*/,产生的redo值:1199248
综合以上的数据,可以明白,如果想INSERT语句执行的更快,产生更少的redo,分两种情况:
非归档模式:
1、在INSERT语句中使用HINT /*+ append */或者使用HINT /*+ append nologging */两者插入数据的速度相同,但是后者产生的日志要少10倍左右
2、insert /*+ append */堆数据时,要排队,其它同样加了append的session只能等待,所以要小心使用。
归档模式:
1、将目标表修改为NOLOGGING(alter table xxx nologging),然后在INSERT语句中使用HINT /*+ append */.或者HINT /*+ append nologging */
2、append在没有使用nologging的情况下,并不会减少归档日志的产生。
3、将表改为nologging属性的情况下插入数据,几乎不会产生归档日志,但前提是必须要使用append参数,否则产生依然会产生归档日志,只不过表在创建时不会产生归档。
关于加快INSERT语句执行速度和HINT /*+ append */及/*+ append nologging */的使用的更多相关文章
- 一个简单insert 语句执行 40ms 原因剖析
背景:一个简单的带有主键的insert 语句,居然要 40ms ,开发受不了,要求降低 因此我们要关注的的 数据从插入落地的IO 中间都干了什么 一.MySQL的文件 首先简单介绍一下MySQL的数据 ...
- 查看Sql语句执行速度
原文链接:http://www.cnblogs.com/New-world/archive/2012/11/28/2793560.htmlMS_SQL模糊查询like和charindex的对比 lik ...
- 测试sql语句执行速度
DBCC DROPCLEANBUFFERS --清除缓冲区 DBCC FREEPROCCACHE --删除计划高速缓存中的元素 SET STATISTICS io ON SET STATISTICS ...
- 40 | insert语句的锁为什么这么多?
在上一篇文章中,我提到 MySQL 对自增主键锁做了优化,尽量在申请到自增 id 以后,就释放自增锁. 因此,insert 语句是一个很轻量的操作.不过,这个结论对于“普通的 insert 语句”才有 ...
- 40 insert语句的锁
40 insert语句的锁 上一篇文章中对mysql自增主键锁做了优化,尽量在申请到自增id后,就释放自增锁. 因此,insert语句是一个很轻量的操作,不过,这个结论对于”普通的insert”才生效 ...
- Python批量执行oracle中的insert语句
从oracle导出一个表的数据,导出的格式是insert语句,数据量30万. 直接在PL/SQL Developer中执行,速度非常慢,脚本中也是100条数据提交一次.因为需要的时间太长,每次中断后, ...
- PL/SQL客户端中执行insert语句,插入中文乱码
问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual; 结果为AMERICAN_ ...
- oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析
oracle查看执行最慢与查询次数最多的sql语句 注:本文来源 于<oracle查看执行最慢与查询次数最多的sql语句> 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率 ...
- PHP执行insert语句报错“Data too long for column”解决办法
PHP执行mysql 插入语句, insert语句在Navicat for mysql(或任意的mysql管理工具) 中可以正确执行,但是用mysql_query()函数执行却报错. 错误 : “Da ...
随机推荐
- localStorage 理解
localStorage对象是HTML5的客户端存储持久化数据的方案.为了能访问到同一个localStorage对象,页面必须来自同一个域名(子域名无效),使用同一种协议,在同一个端口上. 过期策略: ...
- css的样式问题
项目里面遇到一个布局: 然后侧边栏菜单的高度要随着内容的高度变化而变化:所以在这里贴一下代码:效果如下 <!DOCTYPE html> <html lang="en&quo ...
- vue单页应用中根据不同城市不同业务添加百度统计代码
问题描述: 我们知道一般的百度统计代码是添加在html的head里的:但是,因为目前项目是用vue开发的单页应用,所以在路由跳转之间不会刷新页面, 统计代码如果放在项目里的index.heml的hea ...
- 优化 JS 条件语句及JS 数组常用方法, ---- 看完绝对对日后开发有用
前言: 日常所说的优化优化.最后我们到底优化了哪些,不如让我们从代码质量开始:个人觉得简洁简化代码其实觉得存在感挺强烈的QAQ 1. 获取URL中 ?后的携带参数: 这是我见过最简洁的了,若有更简洁的 ...
- Spring Boot嵌入式的Servlet容器
一.查看SpringBoot默认的嵌入式Servlet容器(默认使用的是tomcat) 在IDEA的项目的pom文件中按Ctrl + shift + Alt + U可以打开SpringBoot依赖的图 ...
- 白话算法:时间复杂度和大O表示法
转自:https://www.jianshu.com/p/59d09b9cee58 每一个优秀的开发者脑中都有时间概念.他们想给用户更多的时间让用户做他们想做的事情.他们通过最小化时间复杂度来实现这一 ...
- 批量修改zencart型号:品牌名称+型号格式
批量修改zencart型号:品牌名称+型号格式 将下面代码保存为zc_change_model.php,上传到网站根目录运行即可,操作前先备份数据库 <?php /*** 批量修改zencart ...
- yaourt
https://blog.csdn.net/relcodego/article/details/50531379 https://blog.csdn.net/lsvtogergo/article/de ...
- QT程序在发布的时候应注意的地方
---恢复内容开始--- 我们用QT开发好的应用程序,如果要发布到其他计算机上运行怎么办呢?我们在用VC编程时,单独运行编译好的可执行文件时,经常会发现提示缺少动态库.用QT编程也不例外,在一定程度上 ...
- 约会 Rendezvous:基环树
提炼:tarjan判环,dfs建树,倍增lca,预处理环两点间距离 我犯的错误: 1.基环树不只有一棵,可以有很多 2.自环不能将其忽略,(对于我的算法)应该将其特殊考虑在算法内 3.代码一定要简洁有 ...