oracle sqlloader使用
直接加载有显著的性能提高(不会产生log),前者使用直接路径(不会触发触发器,直接把sga中的脏数据刷新到磁盘)加载,后者使用外部表(默认并行执行),为了提高性能,可以调整sqlldr的 READSIZE , STREAMSIZE ,COLUMNARRAYROWS参数。注意的地方:
1、使用直接路径(direct=true)有一定的限制,有索引的表是不允许这样做的,选项UNRECOVERABLE同理
2、导入完成后校验数据,因为sqlldr没有trim空格
3、使用了direct=true(直接路径),则不能使用insert
4、给有索引的表加载数据完成操作后,为了提高性能可以考虑重建索引
具体代码:
控制文件: UNRECOVERABLE --相当于设置表nologging LOAD DATA INFILE 'e:\TEST_PARTITION.dat' BADFILE 'e:\TEST_PARTITION.bad' DISCARDFILE 'e:\TEST_PARTITION.dsc' APPEND --insert(defualt), APPEND(= append into table table_name ,指定parallel = true时必须是append),replace(=truncate) INTO TABLE TEST_PARTITION FIELDS TERMINATED BY ',' -- OPTIONALLY ENCLOSED BY '"' -- TRAILING NULLCOLS --表的字段没有对应的值时允许为空 ( ID integer external , BIZ_CODE char , USER_ID integer external NULLIF USER_ID = BLANKS , CREATE_DATE DATE "yyyy-mm-dd hh24:mi:ss" NULLIF CREATE_DATE = "SYSDATE", UPDATE_DATE DATE "yyyy-mm-dd hh24:mi:ss" NULLIF UPDATE_DATE = "SYSDATE", STATUS integer external NULLIF STATUS = BLANKS , TOTAL_AMOUNT integer external NULLIF TOTAL_AMOUNT = BLANKS , DISCOUNT_AMOUNT integer external NULLIF DISCOUNT_AMOUNT = BLANKS , TOTAL_POINTS integer external NULLIF TOTAL_POINTS = BLANKS , DELETE_DATE DATE "yyyy-mm-dd hh24:mi:ss" NULLIF DELETE_DATE = "SYSDATE" , PAY_COUNT integer external NULLIF PAY_COUNT = BLANKS , IP char NULLIF IP = '127.0.0.1' , PAYMENT_ID integer external NULLIF PAYMENT_ID = BLANKS , EMALL_SITE_ID integer external NULLIF EMALL_SITE_ID = BLANKS , NOTIFY_FREQ integer external NULLIF NOTIFY_FREQ = BLANKS , RANDOM_CODE char NULLIF RANDOM_CODE = BLANKS )