---
title: 查询索引列的信息发现异常-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于查询索引列的信息发现异常相关的常见问题和使用技巧，帮助您快速解决查询索引列的信息发现异常的难题。
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# 查询索引列的信息发现异常

更新时间：2026-08-25 02:41

适用版本： V4.0.x、V4.1.x、V4.2.x、V4.3.x、V4.4.x 内容类型：Troubleshoot  

## 问题现象

**触发场景**

在 OB-Oracle 租户中，用户通过 `CREATE INDEX` 语句为表创建索引。当创建索引的 SQL 语句中，索引列名被单引号包裹时（如 `'name'`），索引可以成功创建，但后续通过数据字典视图 `DBA_IND_COLUMNS` 查询索引列信息时，发现 `COLUMN_NAME` 返回的列名与实际列名不符。

**具体表现**

- 执行 `CREATE INDEX idx3_sunt1 ON sunt1('name');` 后，索引创建成功。
 - 查询 `DBA_IND_COLUMNS` 时，`COLUMN_NAME` 返回类似 `SYS_NC$xxx` 的生成列名称，而不是实际的列名 `name`。
 - 对比正常创建的索引（如 `CREATE INDEX idx2_sunt1 ON sunt2(id);`），`DBA_IND_COLUMNS` 可以正确返回列名 `id`。

**影响范围**

- 影响通过数据字典视图查询索引列信息的场景。
 - 对依赖 `DBA_IND_COLUMNS`、`ALL_IND_COLUMNS`、`USER_IND_COLUMNS` 等视图获取元数据的工具、脚本或报表可能产生误导。

**发生频率**

必现。只要创建索引时列名带单引号，即可复现该现象。

## 问题原因

**根因分析**

在 OB-Oracle 模式下，当 `CREATE INDEX` 语句中的索引列使用了单引号包裹（如 `'name'`）时，该列名会被解析为字符串常量表达式，而非普通的列引用。此时 OceanBase 会将其作为生成列（Generated Column）来处理，并自动生成一个内部列名（格式为 `SYS_NC$` 开头）。索引实际上是建立在这个内部生成列上，而非原始表列上，因此通过数据字典视图查询时，返回的是内部生成列的名称。

**技术原理说明**

- Oracle 语法兼容模式下，`CREATE INDEX ... ON table_name('column_name')` 中的 `'column_name'` 被解析为表达式 `CAST('column_name' AS ...)` 或类似的常量表达式。
 - 为了支持在表达式上建立索引，OceanBase 需要创建一个隐藏的生成列来存储表达式结果，该列的命名规则为 `SYS_NC$`。
 - 数据字典视图 `DBA_IND_COLUMNS` 记录的是索引底层实际依赖的列，因此返回的是这个隐藏生成列的列名，而非用户预期的原始列名。

**是否为已知问题/Bug**

非 Bug，属于 By Design 的行为。是 SQL 语法使用不当导致的预期结果。

## 关键信息

**诊断方法**

在环境中测试以下语句，观察 `DBA_IND_COLUMNS` 视图的返回结果。

1. 创建正常索引（不加单引号）：

```sql
CREATE INDEX idx2_sunt1 ON sunt1(id);

```

查询 `DBA_IND_COLUMNS`，`COLUMN_NAME` 返回 `ID`。

2. 创建异常索引（列名加单引号）：

```sql
CREATE INDEX idx3_sunt1 ON sunt1('name');

```

查询 `DBA_IND_COLUMNS`，`COLUMN_NAME` 返回 `SYS_NC$xxx` 格式的生成列名称。

## 问题的风险及影响

**业务影响程度**

中

**系统风险评估**

- 索引本身可以正常创建和使用，不会导致查询失败或数据错误。
 - 但如果业务系统或 DBA 脚本依赖 `DBA_IND_COLUMNS` 等视图来匹配索引与表列的对应关系，可能会因返回 `SYS_NC$` 列名而导致元数据管理混乱或脚本逻辑异常。
 - 该索引实际上建立在表达式（字符串常量）上，而非原始列上，因此无法起到加速原始列查询的作用，等同于创建了一个无效索引。

**是否有数据丢失风险**

无数据丢失风险。

## 适用版本

- OBServer 版本：4.x 版本（已在 4.3.5-bp5-hotfix4 上复现）
 - 租户类型：OB-Oracle 租户
 - CPU 架构：ARM / x86 均适用

## 解决方法

创建索引时，索引列名不应使用单引号包裹。

**正确示例**

```sql
CREATE INDEX idx_name ON table_name(column_name);

```

**错误示例**

```sql
CREATE INDEX idx_name ON table_name('column_name');

```

## 规避方式

在编写创建索引的 DDL 语句时，确保列名不使用单引号。对于工具或脚本生成的 SQL，需检查其语法是否符合规范。

上一篇

[因在备份期间创建索引导致创建索引卡在 copy sstable](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000006835416)

下一篇

[NVL 函数索引未命中根因分析与处理方案](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000006802903) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
