Oracle之虚拟列及虚拟列索引

简介: Oracle之虚拟列及虚拟列索引 1. 为什么要使用虚拟列        (1)可以为虚拟列创建索引(oracle为其创建function index)        (2)可以搜集虚拟列的统计信息statistics,为CBO提供一定的采样分析。

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> 表达式不能使用其他虚拟列





   

 

     

 

   

wKiom1RlyOTAoxtEAADQ7jkzJdE787.jpg

wKioL1RlyVTyH5csAADgQp0xZ78505.jpg

   

 

 

 

 

  
>
  
     
      
      
    
  


>
>
>
>
>
  
  
               

                 
                             
                              
                             
   



>

 
>
                                  
 
                                    
                                     
                                    
                              
                                  
  
>
            

                 
                 
                 
                 
     
>
  
               

                   
                 
                             
                              
                             



>
   
  
  
   
  
  

 
>

 
>
                                  
 
                                    
                                     
                                    
                              
                                  
                                  
  
>
             

                    
                    
                    
                    








>

      


 

>

      


 

>

 
>
           

              

>

    





>

 
>
  
          

            
 
>

 
>

 
>
  
          

               



>
  
     
      
      
    
  
  
      
      
      
      
      

 
>

 
>

 
>
           

              
              
              
              
 
>

 
>
           

              
              
     





 

 

 

 

        

        

        

        

 

 

 

 

><

 

>

 

>

                 

                                

                 

 

 

 

 

 

>

 

>

 

>

 

>

        

        

    

 

 

 

>

 

 

 

>

 

>

                   

                                  

                    

                        

 

 

 

 

 

 

 

 

>

 

   

 

>

 

   

 

 

 

 

 

 

>

 

     

 

>

                                          

                                                        

                                                      

                                                     

 

 

 

 

 

 

 

>

 

>

 

>

                   

                                  

                      

                         

 

>

 

    

 

 

>

 

>

 

>

 

>>

 

 

 

>

 

 

 

 

 

 

 










    

img_e3029f287d989cd04bd75432ecc1c172.png
DBA笔试面试讲解
欢迎与我联系

目录
相关文章
|
4月前
|
SQL Oracle 关系型数据库
Oracle-index索引解读
Oracle-index索引解读
74 0
|
9天前
|
存储 Oracle 关系型数据库
Oracle索引知识看这一篇就足够
Oracle索引知识看这一篇就足够
|
15天前
|
存储 Oracle 关系型数据库
Oracle 12c的多重索引:数据的“多维导航仪”
【4月更文挑战第19天】Oracle 12c的多重索引提升数据查询效率,如同多维导航仪。在同一表上创建针对不同列的多个索引,加速检索过程。虽然过多索引会增加存储和维护成本,但合理选择和使用索引策略,结合位图、函数索引等高级特性,能优化查询,应对复杂场景。数据管理员应善用这些工具,根据需求进行索引管理,支持企业数据分析。
|
6月前
|
索引
Oracle-序列、索引和同义词
Oracle-序列、索引和同义词
26 0
|
3月前
|
SQL Oracle 关系型数据库
[Oracle]索引
[Oracle]索引
67 0
[Oracle]索引
|
6月前
|
存储 SQL Oracle
Oracle优化避免索引失效
Oracle优化避免索引失效
193 0
|
7月前
|
存储 Oracle 关系型数据库
9-6 Oracle 管理索引
9-6 Oracle 管理索引
|
12月前
|
SQL Oracle 关系型数据库
Oracle-表分析和索引分析解读
Oracle-表分析和索引分析解读
144 0
|
12月前
|
存储 SQL Oracle
Oracle索引
Oracle索引
82 0

推荐镜像

更多