Oracle之虚拟列及虚拟列索引

Oracle之虚拟列及虚拟列索引




1. 为什么要使用虚拟列

       (1)可以为虚拟列创建索引(oracle为其创建function index)

       (2)可以搜集虚拟列的统计信息statistics,为CBO提供一定的采样分析。

      (3)可以在where 后面使用虚拟列作为选择条件

      (4)只在一处定义,不存储多余数据,查询是动态生成。

2. 语法

[sql] view plain copy

  1.  HR@bear> create table inv(  
  2. 2  inv_id   number,  
  3. 3  inv_count  number,  
  4. 4  inv_status  generated always as   
  5. 5    (case  when  inv_count <= 100 then 'GETTING LOW'  
  6. 6          when  inv_count > 100  then 'OKAY'  
  7. 7    end)  
  8. 8  );  

其中 inv_status 为虚拟列

我们插入一条数据,然后再查询,可以看到虚拟列的值会根据定义动态生成。

[sql] view plain copy

  1. HR@bear> insert into inv (inv_id, inv_count) values (1, 100);  
  2.   
  3. 1 row created.  
  4.   
  5. HR@bear> select * from inv;  
  6.   
  7.     INV_ID  INV_COUNT INV_STATUS  
  8. ---------- ---------- -----------  
  9.          1        100 GETTING LOW  

3.添加一个虚拟列

[sql] view plain copy

  1. alter table inv add  inv_comm generated always as(inv_count * 0.1) virtual ;  

4. 修改现有的一个虚拟列

[sql] view plain copy

  1. alter table inv modify inv_status generated always as(  
  2. case when inv_count <= 50 then 'NEED MORE'  
  3. when inv_count >50 and inv_count <=200 then 'GETTING LOW'  
  4. when inv_count > 200 then 'OKAY'  
  5. end);  

5.虚拟列可以在where子句中使用

[sql] view plain copy

  1. SQL> update inv set inv_count=100 where inv_status='OKAY';  

注意不能直接插入或修改虚拟列的值。

你可以定义虚拟列的数据类型,如果不指定,oracle会自动指定为定义中依赖的列的数据类型。

注意事项:

        (1) 只有堆组织表(heap-organized table)才可以定义虚拟列

        (2) 虚拟列不能引用其他的虚拟列

        (3) 虚拟列只能引用自己表中的列, 不能引用其他表中的列。

        (4) 虚拟列值只能是标量 scalar value (a single value, not a set of values)
Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值。  

  

定义一个虚拟列的语法:  

  

    column_name [datatype] [GENERATED ALWAYS] AS [expression] [VIRTUAL]  

  

1.虚拟列可以用在select,update,delete语句的where条件中,但是不能用于DML语句  

2.可以基于虚拟列来做分区  

3. 可以在虚拟列上建索引,oracle的函数索引就类似。  

4. 可以在虚拟列上建约束  

Oracle11g 增加了虚拟列的新特性, 具体说明如下:

1> 只能在堆组织表(普通表)上创建虚拟列,不能在索引组织表、外部表、临时表上创建虚拟列
2> 虚拟列不能是LOB或者RAW类型
3> 虚拟列的值并不是真实存在的,只有用到时,才根据表达式计算出虚拟列的值,磁盘上并不存放
4> 可把虚拟列当做分区关键字建立分区表,这是ORACLE 11g的另一新特性--虚拟列分区
5> 可在虚拟列上建立索引
6> 如果在已经创建的表中增加虚拟列时,若没有指定虚拟列的字段类型,ORACLE会根据 generated always as 后面的表达式计算的结果自动设置该字段的类型
7> 虚拟列的值由ORACLE根据表达式自动计算得出,不可以做UPDATE和INSERT操作, 可以对虚拟列做 DELETE 操作
8> 表达式中的所有列必须在同一张表
9> 表达式不能使用其他虚拟列




   

 

     

 

   

   

 

 

 

 

  
>
  
     
      
      
    
  

>
>
>
>
>
  
  
               

                 
                             
                              
                             
   

>

 
>
                                  
 
                                    
                                     
                                    
                              
                                  
  
>
            

                 
                 
                 
                 
     
>
  
               

                   
                 
                             
                              
                             

>
   
  
  
   
  
  

 
>

 
>
                                  
 
                                    
                                     
                                    
                              
                                  
                                  
  
>
             

                    
                    
                    
                    

>

      

 

>

      

 

>

 
>
           

              

>

    

>

 
>
  
          

            
 
>

 
>

 
>
  
          

               

>
  
     
      
      
    
  
  
      
      
      
      
      

 
>

 
>

 
>
           

              
              
              
              
 
>

 
>
           

              
              
     



 

 

 

 

        

        

        

        

 

 

 

 

><

 

>

 

>

                 

                                

                 

 

 

 

 

 

>

 

>

 

>

 

>

        

        

    

 

 

 

>

 

 

 

>

 

>

                   

                                  

                    

                        

 

 

 

 

 

 

 

 

>

 

   

 

>

 

   

 

 

 

 

 

 

>

 

     

 

>

                                          

                                                        

                                                      

                                                     

 

 

 

 

 

 

 

>

 

>

 

>

                   

                                  

                      

                         

 

>

 

    

 

 

>

 

>

 

>

 

>>

 

 

 

>

 

 

 

 

 

 

 





    

时间: 2024-09-08 00:43:43

Oracle之虚拟列及虚拟列索引的相关文章

ORACLE 12C 相同列创建多个索引方法

从ORACLE 12C开始允许在同一列上创建不同类型的index,用来做性能调优,不同类型的index主要包括(B*TREE vs BITMAP,Local vs Global) ORACLE 11G  代码如下 复制代码 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g

Oracle 10g新特性之虚拟专用数据库

五种类型的策略.列相关策略以及列屏蔽使得 VPD 成为 DBA 的安全工具箱中一种功能更加强大的工具 虚拟专用数据库 (VPD) 也称为细粒度访问控制,它提供强大的行级安全功能.它是在 Oracle8i 中推出的,已经受到广泛的欢迎,并且在从教育软件到金融服务等各种应用程序得到采用. VPD 的工作方法是,通过透明地更改对数据的请求,基于一系列定义的标准向用户提供表的局部视图.在运行时,所有查询都附加了谓词,以便筛选出准许用户看到的行.例如,如果只允许用户查看帐户管理员 SCOTT 的帐户,则

Oracle的数据表中行转列与列转行的操作实例讲解_oracle

行转列一张表 查询结果为 --行转列 select years,(select amount from Tb_Amount as A where month=1 and A.years=Tb_Amount.years)as m1, (select amount from Tb_Amount as A where month=2 and A.years=Tb_Amount.years)as m2, (select amount from Tb_Amount as A where month=3 a

字段-Oracle数据库两个列合并一个列

问题描述 Oracle数据库两个列合并一个列 将Oracle两个列合并成一个列 SQL怎么写? 比如 有一张表n 字段 a b 1 4 2 5 3 6 合并后为 c 1 2 3 4 5 6 解决方案 select A from n union select B from n 解决方案二: select a as c from n union all select b from n 解决方案三: select concat(n.a,n.b) from n; 解决方案四: select a||b f

java-这个是oracle数据,除了后三列不一样其它都一样,请问怎么一下将这三行值都取出?该怎么取?

问题描述 这个是oracle数据,除了后三列不一样其它都一样,请问怎么一下将这三行值都取出?该怎么取? 解决方案 select a. EMPLOYEEID, a.TRUENAME, a.DATEOFBIRTH, a.WORKEDORG, a. ITEMVALUE, a.RESPONSIBILITY, a.BEGINDATE, a.ENDDATE from 表名 a where a.EMPLOYEEID = 'E00007879' 如果是可以只用EMPLOYEEID就能将所需要的数据区分的话 ,

oracle数据库性能调优技术:索引调优

一.概述 随着数据库在各个领域的使用不断增长,越来越多的应用提出了高性能的要求.数据库性能调优是知识密集型的学科,需要综合考虑各种复杂的因素:数据库缓冲区的大小.索引的创建.语句改写等等.总之,数据库性能调优的目的在于使系统运行得更快. 调优需要有广泛的知识,这使得它既简单又复杂. 说调优简单,是因为调优者不必纠缠于复杂的公式和规则.许多学术界和业界的研究者都在尝试将调优和查询处理建立在数学基础之上. 称调优复杂,是因为如果要完全理解常识所依赖的原理,还需要对应用.数据库管理系统.操作系统以及硬

浅析SQL Server数据库中的伪列以及伪列的含义

原文:浅析SQL Server数据库中的伪列以及伪列的含义   本文出处:http://www.cnblogs.com/wy123/p/6833116.html      SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个常识,对此不作具体详细阐述.这里主要是提到的RowId引起了一点思考.那么,这个RowId是个什么玩意?能不能更加直观一点来看看

SQL Server数据库中伪列及伪列的含义详解

SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个常识,对此不作具体详细阐述. 这里主要是提到的RowId引起了一点思考. 那么,这个RowId是个什么玩意?能不能更加直观一点来看看RowId的信息?代表什么含义?这个当然也是可以的. Oracle中的表中有一个伪列的概念,就是在查询表的时候加上select rowid,* from Table,会

任意列搜索之 列存储优化

标签 PostgreSQL , 列存储 , shard , 切片 , 大块 , 小块 , sort , 块级索引 , bitmap scan , 索引延迟 , 归整 背景 数据分析系统,决策系统的数据量通常非常庞大,属性(列)非常多,可能涉及到任意列的组合条件查询,筛选结果.聚合结果.多维分析等. 这种场景如何优化能满足实时的响应需求呢? PostgreSQL中有一些技术,可以满足此类场景. 1. 内置bitmapAnd bitmapOr,使用任意字段的索引搜索时,可以快速跳过不满足条件的块,快