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