比较使用sql*loader的直接加载方式和传统加载方式的性能差异

简介:

数据库版本

SYS@LEO1>select* from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise EditionRelease 11.2.0.1.0 - 64bit Production

PL/SQLRelease 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS forLinux: Version 11.2.0.1.0 - Production

NLSRTLVersion 11.2.0.1.0 – Production

操作系统信息

[oracle@leonarding1admin]$ uname -a

Linuxleonarding1.oracle.com 2.6.32-200.13.1.el5uek #1 SMP Wed Jul 27 21:02:33 EDT 2011x86_64 x86_64 x86_64 GNU/Linux


比较使用sql*loader直接加载方式和传统加载方式的性能差异,给出演示过程和结论。

第一 我们先要生成平面数据(文本数据)

LEO1@LEO1>create table leo2 as select *from dba_objects;      创建数据源,我们的平面数据就是从这个表中取出

Table created.

第二 我们利用spool工具将屏幕中显示出来的记录写入到指定文件,这样我们就可以得到一个平面文件啦

set termout off;            是否在屏幕上显示输出内容,off屏幕不显示查询语句,主要与spool结合使用

set feedback off;           关闭本次sql命令处理的记录条数,默认为on即去掉最后的已经选择的行数

set echo off;              关闭脚本中正在执行的SQL语句的显示

set heading off;            关闭标题的输出,设置为off就去掉了select结果的字段名只显示数据

set trimout on;            去除标准输出每行后面多余的空格

set trimspool on;          将每行后面多余的空格去掉【linesize-实际字符数=多余空格】


spool /home/oracle/sql_loader/leo3.txt      在屏幕上的所有内容都包含在该文件中

select owner||','||object_name||','||object_id||','||object_typefrom leo2;   

spool off                         只有关闭spool输出,才会在输出文件中看到输出的内容

备注:在实用SPOOL输出内容到本地文件时,需注意编码格式,否则会出现乱码的问题

[oracle@leonarding1 sql_loader]$ ll

total 28468

-rw-r--r-- 1 oracle oinstall  3246601 Jun 22 14:06 leo3.txt          已经生成平面文件leo3.txt

[oracle@leonarding1 sql_loader]$ cat leo3.txt| wc -l              文件中有72678行记录

72678

第三 创建装入的表leo3_loader

LEO1@LEO1>create table leo3_loader

(

  owner       varchar2(30),

  object_name varchar2(130),

  object_id   number,

  object_type varchar2(20)

);

2    3    4   5    6    7  

第四 创建sql*loader的控制文件leo3_loader.ctl

[oracle@leonarding1 sql_loader]$ vim leo3_loader.ctl

load data

infile '/home/oracle/sql_loader/leo3.txt'                             待加载的数据文件

badfile '/home/oracle/sql_loader/leo3_bad.txt'                       格式不匹配写入坏文件

discardfile'/home/oracle/sql_loader/leo3_discard.txt'                  条件不匹配写入丢弃文件

append into table leo3_loader                                     追加的方式插入数据

fields terminated by ","                                           字段与字段之间的分隔符

trailing nullcols                                                 这句的意思是将没有对应值的列都置为null

(owner,object_name,object_id,object_type)                         数据插入的对应字段


第五 执行sqlldr直接加载命令

[oracle@leonarding1 sql_loader]$ sqlldrleo1/leo1 control=leo3_loader.ctl log=leo3_loader.log direct=true

SQL*Loader: Release 11.2.0.1.0 - Productionon Sat Jun 22 14:08:31 2013

Copyright (c) 1982, 2009, Oracle and/or itsaffiliates.  All rights reserved.

Load completed - logical record count72678.

已经加载了72678行,条件不匹配有72行,实际加载入72606行

LEO1@LEO1>select count(*) fromleo3_loader;   表中也是

    72606

我们在看一下sql*loader日志

。。。省略前部份。。。

Total logical records skipped:          0

Total logical recordsread:         72678

Total logical records rejected:         0

Total logical records discarded:       72                   条件不匹配有72行

Total stream buffers loaded by SQL*Loadermain thread:       17

Total stream buffers loaded by SQL*Loaderload thread:        6


Run began on Sat Jun 22 14:08:31 2013

Run ended on Sat Jun 22 14:08:34 2013


Elapsed time was:     00:00:02.60                       所用耗时2.6秒

CPU time was:         00:00:00.13

使用conventional传统加载方式写入数据

LEO1@LEO1>truncate table leo3_loader;                   清空表在加载一次

[oracle@leonarding1 sql_loader]$ sqlldrleo1/leo1 control=leo3_loader.ctl log=leo3_loader.log

LEO1@LEO1>select count(*) fromleo3_loader;   表中也是

    72606

我们在看一下sql*loader日志

。。。省略前部份。。。

Total logical records skipped:          0

Total logical recordsread:         72678

Total logical records rejected:         0

Total logical records discarded:       72                  条件不匹配有72行


Run began on Sat Jun 22 15:25:45 2013

Run ended on Sat Jun 22 15:26:05 2013


Elapsed time was:     00:00:20.79                       所用耗时2.6秒

CPU time was:         00:00:00.48

小结:经过比对direct比conventional要提高了20倍效率,为什么direct会这么高效呢,下面我们来说说这两种的区别。

Direct 特点

(1)数据绕过SGA直接写入磁盘的数据文件

(2)数据直接写入高水位线HWM之后的新块,不会扫描HWM之前的空闲块

(3)commit之后移动HWM他人才能看到

(4)不对已用空间进行扫描

(5)使用direct几乎不产生redo log,不是完全不产生(安全性差),但会产生undo数据

(6)适用OLAP在线分析场景,增 删 改不频繁的场景

Conventional传统加载特点

(1)数据先加载 -> SGA -> 磁盘的数据文件

(2)会扫描高水位线HWM之前的数据块,如果有空闲块(碎片经常DML导致)就会利用,如果没有再插入新块

(3)高水位线HWM之前的数据块是放在SGA区的

(4)会产生redo log和undo数据

(5)安全性高,可恢复数据

(6)传统加载与SQL语句insert插入没区别

 

 

 本文转自 ztfriend 51CTO博客,原文链接:http://blog.51cto.com/leonarding/1227489,如需转载请自行联系原作者


相关文章
|
2月前
|
SQL 关系型数据库 MySQL
为什么这些 SQL 语句逻辑相同,性能却差异巨大?
我是小假 期待与你的下一次相遇 ~
143 0
|
6月前
|
SQL 关系型数据库 PostgreSQL
CTE vs 子查询:深入拆解PostgreSQL复杂SQL的隐藏性能差异
本文深入探讨了PostgreSQL中CTE(公共表表达式)与子查询的选择对SQL性能的影响。通过分析两者底层机制,揭示CTE的物化特性及子查询的优化融合优势,并结合多场景案例对比执行效率。最终给出决策指南,帮助开发者根据数据量、引用次数和复杂度选择最优方案,同时提供高级优化技巧和版本演进建议,助力SQL性能调优。
578 1
|
9月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
10月前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
288 2
|
11月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
1025 3
|
SQL IDE 数据库连接
IntelliJ IDEA处理大文件SQL:性能优势解析
在数据库开发和管理工作中,执行大型SQL文件是一个常见的任务。传统的数据库管理工具如Navicat在处理大型SQL文件时可能会遇到性能瓶颈。而IntelliJ IDEA,作为一个强大的集成开发环境,提供了一些高级功能,使其在执行大文件SQL时表现出色。本文将探讨IntelliJ IDEA在处理大文件SQL时的性能优势,并与Navicat进行比较。
236 4
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
831 10
|
SQL 缓存 监控
SQL性能提升指南:五大优化策略与十个实战案例
在数据库性能优化的世界里,SQL优化是提升查询效率的关键。一个高效的SQL查询可以显著减少数据库的负载,提高应用响应速度,甚至影响整个系统的稳定性和扩展性。本文将介绍SQL优化的五大步骤,并结合十个实战案例,为你提供一份详尽的性能提升指南。
1184 0
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")