- 最后登录
- 2023-8-16
- 在线时间
- 1686 小时
- 威望
- 2135
- 金钱
- 50532
- 注册时间
- 2011-10-12
- 阅读权限
- 200
- 帖子
- 5207
- 精华
- 39
- 积分
- 2135
- UID
- 2
|
3#
发表于 2012-6-17 21:21:57
ODM FINDING:
基于虚拟列的分区
虚拟列值是通过计算函数或表达式得到的。
可以在 CREATE 或 ALTER 表操作中定义虚拟列。
虚拟列值实际上并未存储在磁盘上的表行中,而是根据需要进行计算。
像其它表列类型一样,可以对虚拟列进行索引,可以在查询、DML 和 DDL 语句中使用它们。
可在虚拟列上对表和索引进行分区,甚至可以收集它们的统计信息。
基于虚拟列的分区
如果某个表的列值是通过计算函数或表达式得到的,则这些列就称为虚拟列。可以在 CREATE 或 ALTER 表操作过程中指定这些列。虚拟列与其它实际表列共享相同的 SQL 名称空间,并与对其进行描述的基础表达式的数据类型相一致。可像其它表列一样在查询中使用这些列,因此可在 SQL 语句中提供简单、优美且一致的访问表达式机制。
虚拟列的值实际上并未存储在磁盘上的表行中,而是根据需要进行计算。描述虚拟列的函数或表达式应是明确且无掺杂的,即相同的输入值集应返回相同的输出值。
可以像使用任何其它表列一样使用虚拟列。可对虚拟列进行索引,可在查询、DML 和 DDL 语句中使用它们。可在虚拟列上对表和索引进行分区,甚至可以收集它们的统计信息。
可使用虚拟列分区对表的虚拟列上定义的键列进行分区。对逻辑分区对象的业务要求经常与现有列不一一对应。随着 Oracle Database 11g 的推出,分区功能得到了增强,可以在虚拟列上定义分区策略,因而可以更加全面地匹配业务要求。
基于虚拟列的分区:示例
CREATE TABLE employees
(employee_id number(6) not null, first_name varchar2(30),
last_name varchar2(40) not null, email varchar2(25),
phone_number varchar2(20), hire_date date not null,
job_id varchar2(10) not null, salary number(8,2),
commission_pct number(2,2), manager_id number(6),
department_id number(4),
total_compensation as (salary *( 1+commission_pct))
)
PARTITION BY RANGE (total_compensation)
(
PARTITION p1 VALUES LESS THAN (50000),
PARTITION p2 VALUES LESS THAN (100000),
PARTITION p3 VALUES LESS THAN (150000),
PARTITION p4 VALUES LESS THAN (MAXVALUE)
);
基于虚拟列的分区:示例
请考虑以上的示例。EMPLOYEES 表是使用标准的 CREATE TABLE 语法创建的。total_compensation 列是一个虚拟列,其值的计算方式为:将 salary 的值与 commission_pct 加 1 之后的值相乘。下一个语句将 total_compensation(虚拟列)声明为 EMPLOYEES 表的分区键。
如果分区键上的谓词属于以下类型之一,则将对虚拟列分区键执行分区修剪:
等式或 Like
列表
范围
扩展分区名称
如果两个表之间存在联接操作,则优化程序将确定智能化分区联接(完全或部分)的适用时间,决定是否使用智能化分区联接,并在决定使用时正确注释该联接。这既适用于串行情况也适用于并行情况。
为了确定完全智能化分区联接,优化程序将依赖于对两个对象的均匀分区的定义;此定义包括表据以分区的虚拟表达式的等同性。 |
|