以前一直没注意sql loader用direct方式时怎么处理索引的,也是因为一般用sql loader都是往临时表里导数据,用不着索引。今天试了一下,才发现direct=true时索引不是在insert时维护的,而是在把数据全部插入后再去维护。
以下是实验
设 SQLLDR表上字段 ID建立了PK PK_SQLLDR,相应的索引为UK_SQLLDR
表中已经有了一条ID=0的记录,sqlldr的ctl文件采用append方式
===================================================
不采用direct方式时>sqlldr aeowner/aeowner@jinlo control=sqlldr.1.ctl
log中显示这条记录没有被插入
记录 1: 被拒绝 - 表 SQLLDR 出现错误。
ORA-00001: 违反唯一约束条件 (AEOWNER.PK_SQLLDR)
看一下,确实没有插入
select count(0) from SQLLDR where id=0;
COUNT(0)
----------
1
=====================================================
采用direct方式时>sqlldr aeowner/aeowner@jinlo control=sqlldr.1.ctl direct=true
log中没有异常记录
这条记录确实被插入了
SQL> select count(0) from SQLLDR where id=0;
COUNT(0)
----------
2
相应的索引也处于不可用状态
SQL> select status from dba_indexes where table_name='SQLLDR' and index_name='PK_SQLLDR';
STATUS
--------
UNUSABLE
并且,由于建立了主键,整个表上的写操作都无法进行
SQL> delete from sqlldr where id=0;
delete from sqlldr where id=0
ORA-01502: 索引 'AEOWNER.PK_SQLLDR' 或这类索引的分区处于不可用状态
insert into sqlldr (id) values (1);
insert into sqlldr (id) values (1)
ORA-01502: 索引 'AEOWNER.PK_SQLLDR' 或这类索引的分区处于不可用状态
=====================================================
以上实验可知,对于目标表上有约束(唯一索引)的情况,direct方式可能会破坏数据的完整性,甚至使得后续操作无法继续进行。因此
1) 不是出于性能考虑的话,不要采用direct方式
2) 如果采用direct方式,检查结果时,不能只看sqlldr的log中,还要检查目标表上唯一索引的status,以防悄悄地引入错误数据
分享到:
相关推荐
在使用SQL*Loader时,除了需要目标数据库和平面文件之外,还需要一个控制文件来描述平面文件的内容。控制文件是SQL*Loader的核心配置,用于指定数据文件的格式、目标表结构以及数据转换规则等。图10-1展示了SQL*...
例如,当表存在触发器、索引或约束时,可能无法使用直接路径加载。启用直接路径加载的方式如下: ``` SQLLDR userid=system/oracle control=mydata.ctl log=mydata.log direct=true ``` 总结来说,Oracle SQL ...
SQL*Loader是Oracle数据库系统中的一个强大工具,用于高效地将大量数据从外部文件批量导入到数据库中。它尤其适用于处理大数据量的场景,如数据仓库的构建和维护。SQL*Loader的操作流程主要包括创建控制文件、准备...
在使用SQL*Loader进行数据加载时,我们可能会遇到多种错误情况。SQL*Loader是一个Oracle数据库提供的工具,用于高效地从平面文件批量导入数据。以下是一些常见错误的总结及其解决方案: 1. **编码错误导致的乱码...
在本篇中,我们将深入探讨Oracle的数据导入导出及Sql Loader的使用方法。 1. **Oracle数据导入导出** Oracle提供了多种数据导入导出工具,包括`expdp`(Export Data Pump)和`impdp`(Import Data Pump)以及传统的...
SQL*LOADER有两种主要的工作模式:传统路径(CONVENTIONAL PATH)和直接路径(DIRECT PATH),其中直接路径提供了更快的速度,特别适合大型数据仓库的数据加载需求。 #### 二、SQL*LOADER的基本概念与命令 SQL*...
### SQL*Loader 数据导入详解 #### 一、SQL*Loader简介 SQL*Loader 是 Oracle 数据库下用于数据导入的一种重要工具,它由 Oracle 客户端提供。此工具支持多种数据格式,能够高效地将外部文件中的数据加载到 Oracle ...
Oracle SQL Loader 使用实例 Oracle SQL Loader 是一种强大的数据导入工具,允许用户从文本文件或其他数据源中导入数据到 Oracle 数据库中。本文将详细介绍 Oracle SQL Loader 的使用实例,包括建立文本文件、编写...
若在命令行中直接调用SQL*Loader而不带任何参数,则会显示所有可用的合法参数帮助信息。 #### 四、SQL*Loader的组件 ##### 1. 控制文件(Control File) 控制文件是SQL*Loader的核心组成部分,它定义了外部数据文件...
SQL*Loader有两种主要的运行模式:基本模式和直接路径模式。前者适用于所有类型的数据,而后者则在特定情况下提供更快的速度。 ### 实施步骤详解 #### 1. 创建源文件 首先,需要创建一个包含待导入数据的文件。在...
* 用索引优化向导创建索引:索引优化向导是 SQL Server 2000 提供的新的创建索引工具,使用查询优化器分析工作负荷中的查询任务,向有大量工作负荷的数据库推荐最佳的索引混合方式,以加快数据库的查询。 索引的...
在大型数据仓库应用中,SQL*Loader因其直接路径和并行加载功能而备受青睐,这些特性使得它在大量数据迁移时表现出极高的性能。 **1. SQL*Loader的基本概念** SQL*Loader主要由以下几个组件组成: - **Control ...
### Oracle SQL*Loader 使用方法详解 #### 一、SQL*Loader 概览 SQL*Loader 是 Oracle 数据库中用于批量导入外部数据至数据库的强大工具。它不仅具备与 DB2 Load 工具类似的功能,还提供了更为灵活的加载选项,...
### SQL*Loader知识点详解 #### 一、SQL*Loader简介 SQL*Loader是Oracle数据库用于导入外部数据的强大工具。与DB2的Load工具相比,SQL*...无论是对于初学者还是高级用户来说,掌握SQL*Loader的使用都是非常有帮助的。
SQL*LOADER是oracle的数据加载工具,在NT下sql*loader的命令为SQLLDR,在UNIX下一般为SQLLDR/SQLLOAD。通常用来将操作系统文件迁移到oracle数据库中。它是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径...
"SQL*Loader.zip"可能包含了一份关于如何使用SQL*Loader的详细指南,如"SQL*Loader.pdf"。 SQL*Loader的核心在于控制文件,它是整个数据加载过程的关键。控制文件以纯文本格式编写,定义了数据文件的位置、数据字段...
### Oracle SQL Loader 的详细语法与应用 #### 一、概述 SQL*Loader 是 Oracle 提供的一款强大而灵活的数据加载工具,主要用于将操作系统中的文件数据批量导入到 Oracle 数据库中。相较于其他数据库系统的加载工具...
SQL*Loader有两种运行模式:基本模式(conventional path)和直接模式(direct path),根据不同的场景和性能需求选择合适的模式。 #### 二、SQL*Loader基础命令 ##### 基础命令格式: ``` sqlldr [username/...
- 考虑使用Direct Path Load模式,它跳过了Oracle的SQL引擎,直接将数据写入数据文件,速度更快。 总结来说,Oracle SQL*Loader是一个强大且灵活的数据加载工具,适用于处理大量数据的导入任务。通过理解其工作...