SQL*Loader 笔记 (二) 性能优化 2014

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

最近客户有个测试项目,需要将大量的文本文件用sqlloder加载到oracle数据库中。特此做出如下实验,演练一下sqlloader的几个重要参数。

主要参考官方文档上关于redo产生的控制

Minimize use of the redo log 

One way to speed a direct load dramatically is to minimize use of the redo log. There are three ways to do this. You can disable archiving, you can specify that the load is unrecoverable, or you can set the SQL NOLOGGING parameter for the objects being loaded. This section discusses all methods.

关闭归档日志模式

关闭所有实例

# srvctl stop instance -d devdb -i "devdb1,devdb2”
mount节点1
# srvctl start instance -d devdb -n node1 -o mount
关闭归档
SYS@devdb1 >alter database noarchivelog;
关闭所有实例
# srvctl stop instance -d devdb -i "devdb1,devdb2”
启动所有实例
# srvctl start instance -d devdb -i "devdb1,devdb2"

查看sqlloader所需的文件及大小

$ du -sh *
4.0K    c_stock.ctl                <==控制文件
1021M   c_stock_large.txt   <==数据文件为大小为 1021MB将近1GB,同等大小的文件还有N个
4.0K    c_stock.log               <==输入日志文件

控制文件

$ cat c_stock.ctl
load data
into table tpcc.c_stock
append
FIELDS TERMINATED BY '|'
(
s_i_id,
s_w_id,
s_quantity,
s_dist_01,
s_dist_02,
s_dist_03,
s_dist_04,
s_dist_05,
s_dist_06,
s_dist_07,
s_dist_08,
s_dist_09,
s_dist_10,
s_data,
s_ytd,
s_order_cnt,
s_remote_cnt
)

数据文件

$ cat c_stock.txt
1|1|80|RfIBeBlKPqdPouSIcIdvFmh3|3gZUHn1oqzPvY03Df4iroZZo|x2J0ePT5VJPsUGH93ksRbjie|drvpekDBabpcQ85BFKUqepn5|zFKyOSAP7V4b3xA1wP3cMWEh|wmvyBIrYbZnNINsDxkDoG3g2|H75jUxoeJKB8gSUiI5Te
JcH4|m8iQ0mJxkEE2ZS4wqvsxccDK|8mMFmhzxgFd6QMrYeTQ1BKnQ|4Fb6GEEEOg9ZnwmtZnnFYEt0|7SLI5rAzsw5U0zy6wnhQxBFLM9zfspqq71W1imqyIjiwGHq|0|0|0
2|1|71|SxGgW9Rz6eCprSDpKneQzsf5|znr5SFVB2pHPmmcjoEwFmXSU|aWzxcEsBPHuycfX2ssFDCHMQ|96lkT22ROrePTuez1zV1EGRV|YnoqSY4SUf2B7UiKaknTErgt|QZkjv12hcgvV2pDKttbobhWb|r9VVrZe5Pme8b6geazX2
PoC8|HBmIG7IX6rGlgIhTSjSSeWWc|lJ3YVvWsV7Yr4wdYNHaSefBW|mhEq3ordVk1GFMYoHLGB5HpJ|npisQ5FWxTNMaQvkG2OiO2Pnwej3rS6F5eXL|0|0|0
…….
……. 略去剩余部分

观察当前的log序列号

SYS@devdb1 >select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS     FIRST_CHANGE# FIRST_TIME          NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ---------- ------------- ------------------- ------------ -------------------
         1          1        133   52428800        512          2 NO        CURRENT          1935103 2014/07/23 19:16:57   2.8147E+14
         2          1        132   52428800        512          2 NO        INACTIVE         1929910 2014/07/23 19:16:45      1935103 2014/07/23 19:16:57
         3          2         51   52428800        512          2 NO        CURRENT          1696072 2014/07/23 18:39:50   2.8147E+14
         4          2         50   52428800        512          2 NO        INACTIVE         1660718 2014/07/23 13:53:34      1696072 2014/07/23 18:39:50

在oracle用户下执行sqlloader,参数silent=all 不输出屏幕信息

$ sqlldr userid=tpcc/tpcc control=c_stock.ctl data=c_stock_large.txt silent=all

查看日志输出

$ cat c_stock.log

SQL*Loader: Release 11.2.0.3.0 - Production on Wed Jul 23 19:31:46 2014

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Control File:   c_stock.ctl
Data File:      c_stock_large.txt
Bad File:     c_stock_large.bad
Discard File:  none specified
 
 (Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:     64 rows, maximum of 256000 bytes
Continuation:    none specified
Path used:      Conventional
Silent options: FEEDBACK, ERRORS and DISCARDS

Table TPCC.C_STOCK, loaded from every logical record.
Insert option in effect for this table: APPEND

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
S_I_ID                              FIRST     *   |       CHARACTER           
S_W_ID                               NEXT     *   |       CHARACTER           
S_QUANTITY                           NEXT     *   |       CHARACTER           
S_DIST_01                            NEXT     *   |       CHARACTER           
S_DIST_02                            NEXT     *   |       CHARACTER           
S_DIST_03                            NEXT     *   |       CHARACTER           
S_DIST_04                            NEXT     *   |       CHARACTER           
S_DIST_05                            NEXT     *   |       CHARACTER           
S_DIST_06                            NEXT     *   |       CHARACTER           
S_DIST_07                            NEXT     *   |       CHARACTER           
S_DIST_08                            NEXT     *   |       CHARACTER           
S_DIST_09                            NEXT     *   |       CHARACTER           
S_DIST_10                            NEXT     *   |       CHARACTER           
S_DATA                               NEXT     *   |       CHARACTER           
S_YTD                                NEXT     *   |       CHARACTER           
S_ORDER_CNT                          NEXT     *   |       CHARACTER           
S_REMOTE_CNT                         NEXT     *   |       CHARACTER           

value used for ROWS parameter changed from 64 to 58

Table TPCC.C_STOCK:
  3500000 Rows successfully loaded.      <==成功读取350万条记录
  0 Rows not loaded due to data errors.   <==没有错误
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.


Space allocated for bind array:                 254388 bytes(58 rows)
Read   buffer bytes: 1048576

Total logical records skipped:          0
Total logical records read:       3500000
Total logical records rejected:         0
Total logical records discarded:        0

Run began on Wed Jul 23 19:31:46 2014
Run ended on Wed Jul 23 19:36:11 2014

Elapsed time was:     00:04:24.27     <==执行时间4分钟24秒27
CPU time was:         00:00:50.02

查看执行sqlloader后log的变化,测试环境没有其他应用,可以认为log的变化全部来自于sqlloder加载数据产生。

SYS@devdb1 >select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS     FIRST_CHANGE# FIRST_TIME          NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ---------- ------------- ------------------- ------------ -------------------
         1          1        159   52428800        512          2 NO        CURRENT          2153818 2014/07/23 19:36:03   2.8147E+14
         2          1        158   52428800        512          2 NO        INACTIVE         2148648 2014/07/23 19:35:53      2153818 2014/07/23 19:36:03
         3          2         51   52428800        512          2 NO        CURRENT          1696072 2014/07/23 18:39:50   2.8147E+14
         4          2         50   52428800        512          2 NO        INACTIVE         1660718 2014/07/23 13:53:34      1696072 2014/07/23 18:39:50

本机是rac双节点环境,sqlloader在节点一的服务器上执行,可以看出日志的序列从刚才的133,132变化到了159,158。 节点二的日志不发生变化。

下面开始优化sqlloader

一,优化:直接路径加载

SYS@devdb1 >truncate table tpcc.c_stock;    <==清理环境

$ sqlldr userid=tpcc/tpcc control=c_stock.ctl data=c_stock_large.txt direct=true

$ cat c_stock.log
…...
Number to load: ALL
Number to skip: 0
Errors allowed: 50
Continuation:    none specified
Path used:      Direct    <==直接路径加载
…..
  3500000 Rows successfully loaded.     <==成功读取350万条记录
…...
Run began on Wed Jul 23 19:54:40 2014
Run ended on Wed Jul 23 19:55:10 2014

Elapsed time was:     00:00:30.31   <==执行时间0分钟30秒31, 效果显著!
CPU time was:         00:00:14.94


SYS@devdb1 >select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS     FIRST_CHANGE# FIRST_TIME          NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ---------- ------------- ------------------- ------------ -------------------
         1          1        159   52428800        512          2 NO        INACTIVE         2153818 2014/07/23 19:36:03      2161051 2014/07/23 19:54:58
         2          1        160   52428800        512          2 NO        CURRENT          2161051 2014/07/23 19:54:58   2.8147E+14
         3          2         51   52428800        512          2 NO        CURRENT          1696072 2014/07/23 18:39:50   2.8147E+14
         4          2         50   52428800        512          2 NO        INACTIVE         1660718 2014/07/23 13:53:34      1696072 2014/07/23 18:39:50

虽然直接加载的方式不经过sql引擎,不会产生redo和undo,但是我们看到还是会有微乎其微的日志增长。

二,优化:nologging

SYS@devdb1 >truncate table tpcc.c_stock;    <==清理环境

SYS@devdb1 >alter table tpcc.c_stock nologging;  <==更改表属性,强制不生成日志

$ cat c_stock.log
…..
Path used:      Direct
Run began on Wed Jul 23 20:07:54 2014
Run ended on Wed Jul 23 20:08:30 2014

Elapsed time was:     00:00:35.18  <==执行时间0分钟35秒18, 比刚才慢了将近5秒
CPU time was:         00:00:17.18

SYS@devdb1 >select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS     FIRST_CHANGE# FIRST_TIME          NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ---------- ------------- ------------------- ------------ -------------------
         1          1        159   52428800        512          2 NO        INACTIVE         2153818 2014/07/23 19:36:03      2161051 2014/07/23 19:54:58
         2          1        160   52428800        512          2 NO        CURRENT          2161051 2014/07/23 19:54:58   2.8147E+14
         3          2         51   52428800        512          2 NO        CURRENT          1696072 2014/07/23 18:39:50   2.8147E+14
         4          2         50   52428800        512          2 NO        INACTIVE         1660718 2014/07/23 13:53:34      1696072 2014/07/23 18:39:50

日志序列已经不再变化了,可是并没有使速度变得更快,反而慢了5秒

三,优化:unrecoverable

SYS@devdb1 >truncate table tpcc.c_stock;

unrecoverable  <==在控制文件头加入该参数,不再向数据库控制文件中写入SCN
load data
into table tpcc.c_stock
append
FIELDS TERMINATED BY '|'
(
s_i_id,
s_w_id,
s_quantity,
s_dist_01,
s_dist_02,
s_dist_03,
s_dist_04,
s_dist_05,
s_dist_06,
s_dist_07,
s_dist_08,
s_dist_09,
s_dist_10,
s_data,
s_ytd,
s_order_cnt,
s_remote_cnt
) 


$ sqlldr userid=tpcc/tpcc control=c_stock.ctl data=c_stock_large.txt direct=true silent=all
$ cat c_stock.log
…..
Path used:      Direct
,,,
  3500000 Rows successfully loaded.
 ….
Run began on Wed Jul 23 20:17:57 2014
Run ended on Wed Jul 23 20:18:29 2014

Elapsed time was:     00:00:32.90  <==执行时间0分钟32秒90
CPU time was:         00:00:16.33
效果平平,没有什么变化

四,优化 — parallel

SYS@devdb1 >truncate table tpcc.c_stock;

$ $ sqlldr userid=tpcc/tpcc control=c_stock.ctl data=c_stock_large.txt direct=true parallel=true
$ cat c_stock.log
…..
Path used:      Direct - with parallel option.  <==直接路径加载,并行全开启了
…..
Run began on Wed Jul 23 20:23:36 2014
Run ended on Wed Jul 23 20:24:12 2014
...
Elapsed time was:     00:00:35.53  <==执行时间0分钟35秒53, 最慢的一次。
CPU time was:         00:00:19.03

实验总结:
0,如果是测试环境做数据加载,一定要先关闭归档日志(alter database no archivelog)。如果归档日志不关闭,后面的所有优化都没有效果。
1, sqlloder的direct 加载方式效果最突出。
2,设置表为nologing虽然可以彻底避免日志的生成,但是优化的效果已经不明显了。
3,parallel需要在同时执行多个控制文件,访问多个数据文件是才会有效果。例如:

sqlldr USERID=scott CONTROL=load1.ctl DIRECT=TRUE PARALLEL=true
sqlldr USERID=scott CONTROL=load2.ctl DIRECT=TRUE PARALLEL=true
sqlldr USERID=scott CONTROL=load3.ctl DIRECT=TRUE PARALLEL=true

本文转自ICT时空 dbasdk博客,原文链接:SQL*Loader 笔记 (二) 性能优化 2014,如需转载请自行联系原博主。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5月前
|
SQL 缓存 监控
14个Flink SQL性能优化实践分享
【7月更文挑战第12天】 1. **合理设置并行度**: 根据数据量和资源调整以提高处理速度. 2. **优化数据源**: 使用分区表并进行预处理减少输入量. 3. **数据缓存**: 采用 `BROADCAST` 或 `REPARTITION` 缓存常用数据. 4. **索引和分区**: 创建索引并按常用字段分区. 5. **避免不必要的计算**: 检查并移除多余的计算步骤. 6. **调整内存配置**: 分配足够内存避免性能下降. 7. **优化连接操作**: 选择适合大表和小表的连接方式. 8. **数据类型优化**: 选择合适类型以节省资源. ........
139 1
|
3月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
585 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
2月前
|
SQL 监控 Oracle
Oracle SQL性能优化全面指南
在数据库管理领域,Oracle SQL性能优化是确保数据库高效运行和数据查询速度的关键
|
2月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言
|
4月前
|
SQL 存储 数据库
|
4月前
|
SQL 数据处理 数据库
SQL正则表达式应用:文本数据处理的强大工具——深入探讨数据验证、模式搜索、字符替换等核心功能及性能优化和兼容性问题
【8月更文挑战第31天】SQL正则表达式是数据库管理和应用开发中处理文本数据的强大工具,支持数据验证、模式搜索和字符替换等功能。本文通过问答形式介绍了其基本概念、使用方法及注意事项,帮助读者掌握这一重要技能,提升文本数据处理效率。尽管功能强大,但在不同数据库系统中可能存在兼容性问题,需谨慎使用以优化性能。
64 0
|
4月前
|
SQL 数据管理 关系型数据库
SQL与云计算:利用云数据库服务实现高效数据管理——探索云端SQL应用、性能优化、安全性与成本效益,为企业数字化转型提供全方位支持
【8月更文挑战第31天】在数字化转型中,企业对高效数据管理的需求日益增长。传统本地数据库存在局限,而云数据库服务凭借自动扩展、高可用性和按需付费等优势,成为现代数据管理的新选择。本文探讨如何利用SQL和云数据库服务(如Amazon RDS、Google Cloud SQL和Azure SQL Database)实现高效的数据管理。通过示例和最佳实践,展示SQL在云端的应用、性能优化、安全性及成本效益,助力企业提升竞争力。
75 0
|
5月前
|
SQL 存储 数据库
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
|
5月前
|
SQL 索引
性能优化思路及常用工具及手段问题之索引不合理导致的SQL执行效率低问题如何解决
性能优化思路及常用工具及手段问题之索引不合理导致的SQL执行效率低问题如何解决
|
5月前
|
SQL 监控 Java
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
304 0