Dmfldr的简单使用
使用示例表
SQL> desc production.product
LINEID NAME TYPE$ NULLABLE
---------- --------------------- ------------ --------
1 PRODUCTID INTEGER N
2 NAME VARCHAR(100) N
3 AUTHOR VARCHAR(25) N
4 PUBLISHER VARCHAR(50) N
5 PUBLISHTIME DATE N
6 PRODUCT_SUBCATEGORYID INTEGER N
7 PRODUCTNO VARCHAR(25) N
8 SATETYSTOCKLEVEL SMALLINT N
9 ORIGINALPRICE DEC(19, 4) N
10 NOWPRICE DEC(19, 4) N
11 DISCOUNT DEC(2, 1) N
12 DESCRIPTION TEXT Y
13 PHOTO BLOB Y
14 TYPE VARCHAR(5) Y
15 PAPERTOTAL INTEGER Y
16 WORDTOTAL INTEGER Y
17 SELLSTARTTIME DATE N
18 SELLENDTIME DATE Y
- 导出
- 导出全表
dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/tmp/ldr/test.ctl\' mode=\'out\' LOB_DIRECTORY=\'/tmp/ldr/\'
test.ctl
LOAD DATA
INFILE '/tmp/ldr/product.txt'
INTO TABLE production.product
FIELDS '|'
结果为乱码
查看文件格式
[dmdba@VM-0-3-centos tmp]$ file product.txt
product.txt: ISO-8859 text
这是因为终端的LANG=en_US.utf8
设置导出字符集为UTF-8
dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/tmp/ldr/test.ctl\' mode=\'out\' CHARACTER_CODE=\'UTF-8\' LOB_DIRECTORY=\'/tmp/ldr/\'
查看文件内容不再为乱码
文件格式为utf8
[dmdba@VM-0-3-centos tmp]$ file product.txt
product.txt: UTF-8 Unicode text
-
- 部分导出
导出部分列
test.ctl
LOAD DATA
INFILE '/tmp/ldr/product.txt'
INTO TABLE production.product
FIELDS '|'
(productid,
name,
author,
type)
导出部分行
test.ctl
LOAD DATA
INFILE '/tmp/ldr/product.txt'
INTO TABLE production.product
WHEN type = ‘8’
FIELDS '|'
(productid,
name,
author,
type)
根据关键字when并不能做到导出部分行
- 导入
- 全表导入
dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/tmp/ldr/test.ctl\' CHARACTER_CODE=\'UTF-8\' LOB_DIRECTORY=\'/tmp/ldr/\' LOB_FILE_NAME=\'dmfldr.lob\' mode=\'in\' client_lob=true
(这里要注意client_lob,它代表大字段文件存放位置,true表示放在本地,false表示放在服务器上,默认是false)
test.ctl
LOAD DATA
INFILE '/tmp/ldr/product.txt' replace
INTO TABLE production.pronew
FIELDS '|'
-
- 导入部分数据
跳过前几行
dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/tmp/ldr/test.ctl\' CHARACTER_CODE=\'UTF-8\' LOB_DIRECTORY=\'/tmp/ldr/\' LOB_FILE_NAME=\'dmfldr.lob\' mode=\'in\' client_lob=true skip=5
导入前几列,如果不包含大字段,可以去掉lob相关的参数
dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/tmp/ldr/test.ctl\' CHARACTER_CODE=\'UTF-8\' mode=\'in\'
test.ctl
LOAD DATA
INFILE '/tmp/ldr/product.txt' replace
INTO TABLE production.pronew
FIELDS '|'
(
PRODUCTID,
NAME,
AUTHOR
)
忽略某列原值
test.ctl
LOAD DATA
INFILE '/tmp/ldr/product.txt' replace
INTO TABLE production.pronew
FIELDS '|'
(
PRODUCTID,
NAME FILLER,
AUTHOR
)
- 性能提升
n BUFFER_NODE_SIZE
BUFFER_NODE_SIZE 设置读取文件缓冲区页大小,值越大,缓冲区的页越大,每次读取的数据就越多,每次发送到服务器的数据也就越多,效率越高。但其大小受 dmfldr 客户端内存大小限制。
n READ_ROWS
在某些情况下,BUFFER_NODE_SIZE 读入的数据行数很大,而后续操作处理不了这么大的行数,此时可以用 READ_ROWS来限制处理的行数。dmfldr 取 READ_ROWS 和BUFFER_NODE_SIZE 中较小的值作为一次处理的行数。
n SEND_NODE_NUMBER
指定 dmfldr 在数据载入时发送节点的个数,默认由系统计算一个初始值。若在数据载入时发现发送节点不够用,系统会动态增加分配。在系统内存足够的情况下,可以适当设大 SEND_NODE_NUMBER 值,提升 dmfldr 载入性能。
n TASK_THREAD_NUMBER
指定 dmfldr 在数据载入时处理用户数据的线程数目。默认情况下,dmfldr 将该参数值设为系统 CPU 的个数,但当 CPU 个数大于 8 时,默认值都被置为 8。在 dmfldr 客户端所在机器 CPU 大于 8 环境中,提高 TASK_THREAD_NUMBER 值可以提升 dmfldr 装载性能。
n BLDR_NUM
水平分区表装载时,指定服务器 BLDR 的最大个数,默认为 64。服务器的 BLDR 保存水平分区子表相关信息,BLDR_NUM 的设置也就指定了服务器能同时载入的水平分区子表的个数。若 BLDR_NUM 设置太大,当水平分区子表数过多时,可能会导致服务器内存不足。当载入时实际需要的 BLDR 个数超出 BLDR_NUM 设置时,会淘汰指定子表的 BLDR,并替换为新的子表 BLDR。
n BDTA_SIZE
BDTA(Batch Data)的大小,默认为 5000。
BDTA 代表 DM 数据库批量数据处理机制中一个批量,在内存、CPU 允许的条件下,增大BDTA_SIZE能加快装载速度;在网络是装载性能瓶颈时,增大 BDTA_SIZE 影响不大。
n INDEX_OPTION
索引的设置选项,默认为 1。INDEX_OPTION 的可选项有 1、2 和 3。
1 代表服务器装载数据时先不刷新二级索引,而是将新数据按照索引预先排序,在装载完成后,再将排好序的数据插入索引。如果在数据载入前,目标表中已有较多数据,建议INDEX_OPTION 置为 1。
2 代表服务器在快速装载过程中不刷新二级索引数据,只在装载完成时重建所有二级索引。如果在数据载入前,目标表中没有数据或数据量较小,建议 INDEX_OPTION 置为 2。
3 代表服务器使用追加模式来进行二级索引的插入, 在数据装载的过程中, 同时进行二级索引的插入, 当原有数据量远大于插入数据量时, 建议 INDEX_OPTION 置为 3。
例:
dmfldr userid=SYSDBA/SYSDBA control=\'/tmp/ldr/test.ctl\'
test.ctl
options
(
CHARACTER_CODE='UTF-8'
LOB_DIRECTORY='/tmp/ldr/'
LOB_FILE_NAME='dmfldr.lob'
mode='in'
client_lob=true
read_rows=5
)
LOAD DATA
INFILE '/tmp/ldr/product.txt' replace
INTO TABLE production.pronew
FIELDS '|'
参考:达梦技术手册-DM8_dmfldr使用手册
欢迎访问达梦社区:http://eco.dameng.com