Oracle的神秘不可见列(oracle不可见列)

Oracle的神秘不可见列

Oracle作为一个世界著名的关系型数据库管理系统,它有着非常丰富的功能和特性。其中一项比较神秘的功能是Oracle的不可见列(invisible columns)。本文将深入探讨不可见列的概念、应用及实现方式。

1. 不可见列的概念

不可见列是指表中存在但不可见的列,在表结构中看不到它们的存在,但它们依然是表的一部分,可以进行CRUD操作。在查询时,如果不指定这些不可见列,将不会返回这些列的数据。

不可见列可以在表创建的时候定义,也可以通过ALTER TABLE语句来添加。在定义不可见列时,需要使用INVISIBLE关键字,例如:

CREATE TABLE my_table (

col1 NUMBER,

col2 NUMBER,

col3 NUMBER INVISIBLE

);

使用DESCRIBE命令来查看表结构时,不可见列不会显示出来,例如:

DESCRIBE my_table;

会输出以下结果:

Name Null? Type

———- ——– ————

COL1 NUMBER

COL2 NUMBER

2. 不可见列的应用

1)物理列分区

在某些场景中,一个表的物理存储可能分布在不同的物理分区中。如果表结构中包含了分区键,那么查询时需要指定分区键,否则无法从每个物理分区中获取到相应的行数据。但是,在有些查询中,需要使用到除分区键以外的列,这里就可以使用不可见列来解决这个问题。例如,下面这个表存储了每个员工的工资,不同的区域对应不同的物理分区。

CREATE TABLE salary (

emp_id NUMBER,

salary NUMBER,

area_id NUMBER

)

PARTITION BY HASH (area_id);

如果需要查询某个区域的所有员工及其工资,可以使用以下SQL:

SELECT emp_id, salary FROM salary PARTITION (area_1) WHERE area_id=1;

但是如果需要查询某个区域的所有员工及其工资和所在区域,这时候就可以定义一个不可见列来获取:

ALTER TABLE salary ADD area_id INVISIBLE;

SELECT emp_id, salary, area_id FROM salary PARTITION (area_1) WHERE area_id=1;

2)列筛选器

在某些情况下,需要设置一些列仅在某些查询中可见,例如一些具有敏感性质的数据。这时候就可以使用不可见列。例如下面这个表定义了一个不可见列“id_number”:

CREATE TABLE employee (

emp_id NUMBER,

name VARCHAR2(30),

age NUMBER,

id_number VARCHAR2(20) INVISIBLE

);

可以在SELECT语句中指定哪些列可以获取到:

SELECT emp_id, name, age FROM employee;

这样就不会返回id_number列的数据。

3. 实现方式

Oracle的不可见列实现方式是基于系统版本号的嵌套循环,使用隐式谓词来控制查询中所使用的不可见列。这种方式类似于分区表的实现方式。

查询计划中包含了INVISIBLE_PREDICATE函数,它用于控制结果集,过滤掉不可见列。如果想查询不可见列,可以使用以下语句:

ALTER SESSION SET “_invisible_columns”=ALL;

4. 总结

不可见列是Oracle数据库中非常神秘的一个特性,它为我们的查询操作提供了更多的灵活性。但是由于它直接影响了查询计划,因此需要谨慎使用,尤其是在大型系统和高并发场景下。


数据运维技术 » Oracle的神秘不可见列(oracle不可见列)