SQL load direct path load index 无效的原因

Index (unique) state changing to unusable status after data loading using SQL*Loader. The steps below are executed to load the data:

1/ disable constraint--如果不是单独建的index, 对应index会drop掉的

2/ load data using SQL*Loader

3/ remove duplicate records

4/ enable constraint

The execution of step 3 fails due to an index in unusable state:

\n removing duplicate records from the table ... \n

DELETE FROM <TABLE_NAME1> WHERE rowid not in (SELECT MIN(rowid) FROM <TABLE_NAME1> GROUP BY <COLUMN_NAME>)---rowid在期间不能有table move 操作

*

ERROR at line 1:

ORA-01502: index '<INDEX_NAME>_PK' or partition of such index is

in unusable state

Checking the available indexes and their status from dba_indexes, we have:

|-------------------|------------|----------|-----------------|
| INDEX_NAME | INDEX_TYPE | STATUS | TABLE_NAME |
| <INDEX_NAME>_PK | NORMAL | UNUSABLE | <TABLE_NAME1> |
| <INDEX_NAME>_PK | NORMAL | VALID | <TABLE_NAME2> |

CHANGES

CAUSE

Some integrity constraints are automatically disabled During a direct path load. The constraints that remain enabled during a direct path load are:

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY (unique-constraints on not-null columns)--PK自动not null

这么说不就是外键 check disable了

  • NOT NULL constraints are checked at column array build time. Any row that violates the NOT NULL constraint is rejected.

Even though UNIQUE constraints remain enabled during direct path loads, any row that violates those constraints is loaded anyway (this is different than in conventional path in which such rows would be rejected).

When indexes are rebuilt at the end of the direct path load, UNIQUE constraints are verified and if a violation is detected, then the index will be left in an unusable state.

不拒绝

Indexes Left in an Unusable State


SQL*Loader leaves indexes in an Index Unusable state when the data segment being loaded becomes more up-to-date than the index segments that index it.

Any SQL statement that tries to use an index that is in an Index Unusable state returns an error. The following conditions cause a direct path load to leave an index or a partition of a partitioned index in an Index Unusable state:

  • SQL*Loader runs out of space for the index and cannot update the index.

  • The data is not in the order specified by the SORTED INDEXES clause.

  • There is an instance failure, or the Oracle shadow process fails while building the index.

  • There are duplicate keys in a unique index.

  • Data savepoints are being used, and the load fails or is terminated by a keyboard interrupt after a data savepoint occurred.

Hence this is a expected behavior as:

  • Some duplicate rows are getting loaded and indexes are going to unusable state when unique indexes are used.

  • Or -

  • SQL*Loader leaves indexes in an Index Unusable state when the data segment being loaded becomes more up-to-date than the index segments that index it.

SOLUTION

To overcome the issue:

  • In few cases using conventional path load has resolved the issue.
  • Or -
  • Using normal index instead of unique index will not affect the index status.
  • 先建立普通index 加unique key 控制
  • Or -
  • One can follow below workaround for unique indexes.

  • 本来是个死局,重复的删不了,index不能rebuild,只有drop,

    • Drop the offending index and load the data.
    • Detect duplicate rows
    • Remove the duplicate rows and recreate the index.
相关推荐
csdn_aspnet33 分钟前
mysql 使用逗号拼接一列数据
数据库·mysql·group_concat
Csvn1 小时前
📊 SQL 入门 Day 1:SELECT & WHERE — 数据查询的基本功
后端·sql
大师兄66681 小时前
HarmonyOS7 数据持久化 relationalStore:数据库实战
数据库·arkui·实战案例·harmonyos7
冰茶丿1 小时前
状态机在嵌入式系统中的应用:不只是switch-case这么简单
数据库·嵌入式硬件·mongodb
AIHR数智引擎1 小时前
15%对撞40%:WEF白皮书里的AI组织隐忧
数据库·人工智能·经验分享·职场和发展·aihr
卓怡学长1 小时前
w261springboot基于web学校课程管理系统
java·数据库·spring boot·spring·intellij-idea
嘉泰姆半导体官方1 小时前
CXAR41337C 双通道数字音频功放 | 2×20W | EQ+DRC | I²S | MCLK-Less - 嘉泰姆电子
前端·javascript·数据库
不坑老师2 小时前
怎么在Word中制作汉字书写笔顺——不坑盒子汉字笔顺步骤在小学低段识字教学中的应用
前端·数据库·人工智能·word·excel·office
苍狼唤2 小时前
SQL+C# 增删改查(练习)
数据库·sql·c#
2301_800256112 小时前
第七章 空间存储与索引 知识点梳理-2
数据库·sql·oracle