以前一直没注意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,以防悄悄地引入错误数据
分享到:
相关推荐
例如,当表存在触发器、索引或约束时,可能无法使用直接路径加载。启用直接路径加载的方式如下: ``` SQLLDR userid=system/oracle control=mydata.ctl log=mydata.log direct=true ``` 总结来说,Oracle SQL ...
在使用SQL*Loader进行数据加载时,我们可能会遇到多种错误情况。SQL*Loader是一个Oracle数据库提供的工具,用于高效地从平面文件批量导入数据。以下是一些常见错误的总结及其解决方案: 1. **编码错误导致的乱码...
SQL*Loader是Oracle数据库系统中的一个强大工具,用于高效地将大量数据从外部文件批量导入到数据库中。它尤其适用于处理大数据量的场景,如数据仓库的构建和维护。SQL*Loader的操作流程主要包括创建控制文件、准备...
在本篇中,我们将深入探讨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 ...
在这个应用实例中,我们将探讨如何在 C# 中使用 `System.Diagnostics.Process` 类来调用 Sql Loader 命令。 首先,了解 Sql Loader 的基本工作原理是必要的。它读取控制文件(.ctl 文件),这个文件定义了数据文件...
若在命令行中直接调用SQL*Loader而不带任何参数,则会显示所有可用的合法参数帮助信息。 #### 四、SQL*Loader的组件 ##### 1. 控制文件(Control File) 控制文件是SQL*Loader的核心组成部分,它定义了外部数据文件...
SQL*Loader有两种主要的运行模式:基本模式和直接路径模式。前者适用于所有类型的数据,而后者则在特定情况下提供更快的速度。 ### 实施步骤详解 #### 1. 创建源文件 首先,需要创建一个包含待导入数据的文件。在...
大批量CSV格式数据上传jar包。sqlloader.jar包
* 用索引优化向导创建索引:索引优化向导是 SQL Server 2000 提供的新的创建索引工具,使用查询优化器分析工作负荷中的查询任务,向有大量工作负荷的数据库推荐最佳的索引混合方式,以加快数据库的查询。 索引的...
### Oracle SQL*Loader 使用方法详解 #### 一、SQL*Loader 概览 SQL*Loader 是 Oracle 数据库中用于批量导入外部数据至数据库的强大工具。它不仅具备与 DB2 Load 工具类似的功能,还提供了更为灵活的加载选项,...
Sqlloader 简介及使用指南 Sqlloader 是 Oracle 提供的一款数据加载工具,用于将数据从外部文件加载到 Oracle 数据库中。 Sqlloader 工具可以处理各种格式的数据文件,包括固定宽度文件、可变宽度文件、 CSV 文件...
"SQL Server 索引结构及其使用(聚集索引与非聚集索引)" 数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍...
通常,这样的程序会有一个按钮,用户点击后触发上述Java代码,通过图形化的方式方便用户上传数据文件和控制文件,然后调用SQL*Loader进行数据导入。 总的来说,SQL*Loader是Oracle数据库管理中的重要工具,而通过...
使用 SQLloader 导入数据有很多优点,例如: * 可以快速批量上传大量数据 * 不需要使用第三方工具,直接使用 Oracle 自带的程序 * 可以灵活地控制数据的上传方式 准备数据文件 在使用 SQLloader 导入数据之前,...
3. **运行SQL*Loader**:在命令行环境中,使用以下命令执行`SQL*Loader`: ``` sqlldr username/password@database control=control_file.ctl log=log_file.log bad=bad_file.bad ``` 这里,`username/password`...
SQL*LOADER是oracle的数据加载工具,在NT下sql*loader的命令为SQLLDR,在UNIX下一般为SQLLDR/SQLLOAD。通常用来将操作系统文件迁移到oracle数据库中。它是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径...
SQL*Loader有两种运行模式:基本模式(conventional path)和直接模式(direct path),根据不同的场景和性能需求选择合适的模式。 #### 二、SQL*Loader基础命令 ##### 基础命令格式: ``` sqlldr [username/...
- 考虑使用Direct Path Load模式,它跳过了Oracle的SQL引擎,直接将数据写入数据文件,速度更快。 总结来说,Oracle SQL*Loader是一个强大且灵活的数据加载工具,适用于处理大量数据的导入任务。通过理解其工作...