`
iamlotus
  • 浏览: 107906 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

用sql loader时若有唯一索引需慎用direct方式

SQL 
阅读更多

以前一直没注意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,以防悄悄地引入错误数据

0
0
分享到:
评论

相关推荐

    oracle sql loader全攻略

    例如,当表存在触发器、索引或约束时,可能无法使用直接路径加载。启用直接路径加载的方式如下: ``` SQLLDR userid=system/oracle control=mydata.ctl log=mydata.log direct=true ``` 总结来说,Oracle SQL ...

    SQL LOADER错误小结

    在使用SQL*Loader进行数据加载时,我们可能会遇到多种错误情况。SQL*Loader是一个Oracle数据库提供的工具,用于高效地从平面文件批量导入数据。以下是一些常见错误的总结及其解决方案: 1. **编码错误导致的乱码...

    SQL*Loader详细介绍

    SQL*Loader是Oracle数据库系统中的一个强大工具,用于高效地将大量数据从外部文件批量导入到数据库中。它尤其适用于处理大数据量的场景,如数据仓库的构建和维护。SQL*Loader的操作流程主要包括创建控制文件、准备...

    关于 Oracle 的数据导入导出及 Sql Loader (sqlldr)

    在本篇中,我们将深入探讨Oracle的数据导入导出及Sql Loader的使用方法。 1. **Oracle数据导入导出** Oracle提供了多种数据导入导出工具,包括`expdp`(Export Data Pump)和`impdp`(Import Data Pump)以及传统的...

    SQL_LOADER教程

    SQL*LOADER有两种主要的工作模式:传统路径(CONVENTIONAL PATH)和直接路径(DIRECT PATH),其中直接路径提供了更快的速度,特别适合大型数据仓库的数据加载需求。 #### 二、SQL*LOADER的基本概念与命令 SQL*...

    sqlloader数据导入详解

    ### SQL*Loader 数据导入详解 #### 一、SQL*Loader简介 SQL*Loader 是 Oracle 数据库下用于数据导入的一种重要工具,它由 Oracle 客户端提供。此工具支持多种数据格式,能够高效地将外部文件中的数据加载到 Oracle ...

    Sql Loader 在C#的应用实例

    在这个应用实例中,我们将探讨如何在 C# 中使用 `System.Diagnostics.Process` 类来调用 Sql Loader 命令。 首先,了解 Sql Loader 的基本工作原理是必要的。它读取控制文件(.ctl 文件),这个文件定义了数据文件...

    sqlloader详解

    若在命令行中直接调用SQL*Loader而不带任何参数,则会显示所有可用的合法参数帮助信息。 #### 四、SQL*Loader的组件 ##### 1. 控制文件(Control File) 控制文件是SQL*Loader的核心组成部分,它定义了外部数据文件...

    sqlloader的成功案例

    SQL*Loader有两种主要的运行模式:基本模式和直接路径模式。前者适用于所有类型的数据,而后者则在特定情况下提供更快的速度。 ### 实施步骤详解 #### 1. 创建源文件 首先,需要创建一个包含待导入数据的文件。在...

    sqlloader jar包

    大批量CSV格式数据上传jar包。sqlloader.jar包

    数据库 创建索引 sql oracle

    * 用索引优化向导创建索引:索引优化向导是 SQL Server 2000 提供的新的创建索引工具,使用查询优化器分析工作负荷中的查询任务,向有大量工作负荷的数据库推荐最佳的索引混合方式,以加快数据库的查询。 索引的...

    oracle -sqlloader使用方法

    ### Oracle SQL*Loader 使用方法详解 #### 一、SQL*Loader 概览 SQL*Loader 是 Oracle 数据库中用于批量导入外部数据至数据库的强大工具。它不仅具备与 DB2 Load 工具类似的功能,还提供了更为灵活的加载选项,...

    sqlloader 第二部分318页开始

    Sqlloader 简介及使用指南 Sqlloader 是 Oracle 提供的一款数据加载工具,用于将数据从外部文件加载到 Oracle 数据库中。 Sqlloader 工具可以处理各种格式的数据文件,包括固定宽度文件、可变宽度文件、 CSV 文件...

    SQL Server 索引结构及其使用(聚集索引与非聚集索引)

    "SQL Server 索引结构及其使用(聚集索引与非聚集索引)" 数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍...

    一个简单的调用sql loader批量数据导入程序

    通常,这样的程序会有一个按钮,用户点击后触发上述Java代码,通过图形化的方式方便用户上传数据文件和控制文件,然后调用SQL*Loader进行数据导入。 总的来说,SQL*Loader是Oracle数据库管理中的重要工具,而通过...

    如何使用SQLloader导入数据(word文档良心出品).doc

    使用 SQLloader 导入数据有很多优点,例如: * 可以快速批量上传大量数据 * 不需要使用第三方工具,直接使用 Oracle 自带的程序 * 可以灵活地控制数据的上传方式 准备数据文件 在使用 SQLloader 导入数据之前,...

    通过sqlloader将csv中文件写入数据库中

    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详解

    SQL*LOADER是oracle的数据加载工具,在NT下sql*loader的命令为SQLLDR,在UNIX下一般为SQLLDR/SQLLOAD。通常用来将操作系统文件迁移到oracle数据库中。它是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径...

    sql*loader 指南

    SQL*Loader有两种运行模式:基本模式(conventional path)和直接模式(direct path),根据不同的场景和性能需求选择合适的模式。 #### 二、SQL*Loader基础命令 ##### 基础命令格式: ``` sqlldr [username/...

    ORACLE SQL Loader

    - 考虑使用Direct Path Load模式,它跳过了Oracle的SQL引擎,直接将数据写入数据文件,速度更快。 总结来说,Oracle SQL*Loader是一个强大且灵活的数据加载工具,适用于处理大量数据的导入任务。通过理解其工作...

Global site tag (gtag.js) - Google Analytics