关于加快INSERT语句执行速度和 HINT /*+ append*/及nologging的使用
2018-01-23 18:06
671 查看
(非归档模式下)创建表T01:
SQL> create table t01 as select * from dba_objects where 1=2;
Table created.
(非归档模式下)查看当前redo大小:
SQL> select value
2 from vmystat,vstatname
3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’
5 /
(非归档模式下)普通INSERT语句插入:
SQL> insert into t01 select * from dba_objects;
11698 rows created.
(非归档模式下)查看普通INSERT语句执行后,当前redo大小:
SQL> select value
from vmystat,vstatname
2 3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’;
(非归档模式)采用HINT /+ append/执行INSERT语句:
SQL> insert /+ append / into t01 select * from dba_objects;
11698 rows created.
(非归档模式)查询带/+ append/的INSERT执行后,当前redo大小:
SQL> select value
2 from vmystat,vstatname
3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’;
(非归档模式)计算使用HINT(/+ append/)和普通INSERT语句分别产生的redo大小:
SQL> select (1308140-1305724) redo_append,(1305724-49784) redo from dual;
REDO_APPEND REDO
2416 1255940
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 vmystat,vstatname
3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’
5 /
(归档模式)执行普通INSERT语句:
SQL> insert into t01 select * from dba_objects;
11698 rows created.
(归档模式)普通INSERT方式产生的redo大小:
SQL> select value
2 from vmystat,vstatname
3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’
5 /
(归档模式)采用HINT /+ append/执行INSERT语句:
SQL> insert /+ append / into t01 select * from dba_objects;
11698 rows created.
(归档模式)查询带/+ append/的INSERT执行后,当前redo大小:
SQL> select value
2 from vmystat,vstatname
3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’;
(归档模式)计算使用HINT(/+ append/)和普通INSERT语句分别产生的redo大小:
SQL> select (2451664-1218884) redo_append,(1218884-19540) from dual;
REDO_APPEND (1218884-19540)
1232780 1199344
SQL> select value
2 from vmystat,vstatname
3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’
5 /
SQL> insert /+ append nologging / into t01 select * from dba_objects;
或者执行:
SQL> insert /+ append / into t01 nologging select * from dba_objects;
(归档模式)修改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 vmystat,vstatname
3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’
5 /
(归档模式)执行普通INSERT语句:
SQL> insert into t01 select * from dba_objects;
11698 rows created.
SQL> select value
2 from vmystat,vstatname
3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’
5 /
(归档模式)采用HINT /+ append/执行INSERT语句:
SQL> insert /+ append / into t01 select * from dba_objects;
11698 rows created.
SQL> select value
2 from vmystat,vstatname
3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’
5 /
(归档模式)计算两者产生的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,分两种情况:
非归档模式:在INSERT语句中使用HINT /+ append /
归档模式:将目标表修改为NOLOGGING(alter table xxx nologging),然后在INSERT语句中使用HINT /+ append /.
[@more@]
SQL> create table t01 as select * from dba_objects where 1=2;
Table created.
(非归档模式下)查看当前redo大小:
SQL> select value
2 from vmystat,vstatname
3 where vmystat.statistic#=vstatname.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 vmystat,vstatname
2 3 where vmystat.statistic#=vstatname.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 vmystat,vstatname
3 where vmystat.statistic#=vstatname.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 vmystat,vstatname
3 where vmystat.statistic#=vstatname.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 vmystat,vstatname
3 where vmystat.statistic#=vstatname.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 vmystat,vstatname
3 where vmystat.statistic#=vstatname.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 vmystat,vstatname
3 where vmystat.statistic#=vstatname.statistic#
4 and v$statname.name=’redo size’
5 /
VALUE
2541780SQL> 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 vmystat,vstatname
3 where vmystat.statistic#=vstatname.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 vmystat,vstatname
3 where vmystat.statistic#=vstatname.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 vmystat,vstatname
3 where vmystat.statistic#=vstatname.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,分两种情况:
非归档模式:在INSERT语句中使用HINT /+ append /
归档模式:将目标表修改为NOLOGGING(alter table xxx nologging),然后在INSERT语句中使用HINT /+ append /.
[@more@]
相关文章推荐
- 关于加快INSERT语句执行速度和HINT /*+ append */及/*+ append nologging */的使用
- 关于加快insert语句执行速度的测试
- JAVA执行INSERT或UPDATE语句比较慢,如何加快执行速度
- 关于insert /*+ append*/ 各种insert插入速度比较
- MYSQL中关于insert语句速度的优化
- 消息队列使用,异步执行,加快速度
- C#使用oledb连接excel执行Insert Into语句出现“操作必须使用一个可更新的查询”的解决办法
- 关于Qt使用QSqlQuery执行sql语句时出现out of memory的问题
- MySQL中关于insert语句速度的优化
- MYSQL中关于insert语句速度的优化
- 关于insert /*+ append*/ 各种insert插入速度比较
- 连接excel执行Insert Into语句出现“操作必须使用一个可更新的查询”的解决
- 执行Insert语句时使用string的Format用法
- 关于unity中使用yield return newWaitForSeconds()后面语句不执行
- MySQL中关于insert语句速度的优化
- 使用多窗体时, 关于节约内存和加快启动速度的思考与尝试
- 从 VCL 中吸取营养--使用多窗体时, 关于节约内存和加快启动速度的思考与尝试
- 执行Insert语句时使用string的Format用法
- 关于hibernate HQL不能使用insert语句
- 使用多窗体时, 关于节约内存和加快启动速度的思考与尝试