千家信息网

oracle11g中虚拟列有什么用

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章将为大家详细讲解有关oracle11g中虚拟列有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。由于之前的一个sql效率不高,尝试了多种写法,虽然执行计
千家信息网最后更新 2025年01月20日oracle11g中虚拟列有什么用

这篇文章将为大家详细讲解有关oracle11g中虚拟列有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

由于之前的一个sql效率不高,尝试了多种写法,虽然执行计划比较优,但是执行效率还是很低下(结果需要3s多),表本身数据量大概是320W左右,统计全表,其实业务需求本身理解起来并不复杂,就是对某张表的某一列进行判断,统计这一列在不同范围的数目。于是想起来此业务是可以使用虚拟列来计算这一列的值的。
虚拟列小释:虚拟列是oracle11g引入的新特性,它是根据当前表其他列计算出来的列值,此列数据不存储在数据文件中,它只是作为一个表达式存储在数据字典中,因此,此列不能进行DML操作,此外,虚拟列不能引用虚拟列。
在虚拟列可以进行如下操作:
1、可以在虚拟列上建立索引;
2、可以在虚拟列上建立约束;
3、可以基于虚拟列进行分区操作。
表结构如下:
create table people (id varchar2(32),name varchar2(10),id_card varchar2(40),medisecu varchar2(50))
comment on column people.name is '姓名';
comment on column people.id_card is '身份证号';
comment on column people.medisecu is '所买保险品种';
插入测试数据后:
select * from people;

业务需求如下,统计买了单保险的有多少人,买了多保险的有多少人。因此我希望在此表单独有一列对此人所买保险是单保险还是多保险做一个判断。
此需求需要用到自定义函数,建立用户自定义函数:
create or replace function fn_medisecu (i_id in varchar2,i_medisecu in varchar2 default null)
return number deterministic --oracle要求对于用户自定义函数,必须声明函数的确定性(deterministic)
as
v_count pls_integer:=0;---pls_integer这个数据类型值得关注,效率高于number,pls_integer和number数值类型介绍,请移步http://blog.itpub.net/30485601/viewspace-2151857/
begin
select count(people_id)
into v_count
from diagninfo
where people_id=i_id and en_disease_code is not null and disease_jzlx in(1,2,3,4);--这个不用关注,是此人需要满足的条件
if i_medisecu is not null and v_count<>0
then
if i_medisecu='10'
then return 0;
else
if length(replace(i_medisecu,',',''))=1--单保险
then return 1;
elsif length(replace(i_medisecu,',',''))>1--多保险
then return 2;
end if;
end if;
else
return 0;
end if;
end;
建立虚拟列:
alter table people add vir_medisecu number generated always as (fn_medisecu(id,medisecu)) virtual;--其中generated和always 为可选关键字,写不写都可以,区别不大,如果忽略虚拟列的数据类型,oracle会根据as后的表达式结果的最终数据类型确定此虚拟列的数据类型。
在虚拟列上建立索引,同时收集统计信息:
create index people_vir_medisecu on people(vir_medisecu);
begin
dbms_stats.gather_table_stats(ownname => 'QJ',tabname => 'PEOPLE');
end;
begin
dbms_stats.gather_index_stats(ownname => 'QJ',indname => 'PEOPLE_VIR_MEDISECU');
end;
再次对单保险和多保险进行统计,结果缩减到了0.2s。
虚拟列要注意的问题:
1、虚拟列的使用会带来其他问题,包含了虚拟列的表在进行insert操作的时候不能省略column列表,因此,必须和开发人员确定所有对于虚拟列表的插入完整的写了column,不然程序会报错;
2、无法使用create table as select 创建一个包含虚拟列的表,只能建表之后重新添加虚拟列。

关于"oracle11g中虚拟列有什么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

数据 类型 统计 函数 业务 效率 篇文章 结果 需求 更多 此列 用户 索引 表达式 还是 问题 存储 不同 不错 低下 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 知乎的发帖数据库设计 河北网络安全宣传周2017 服务器安全狗杀毒百科 网络安全二级等保一般多少钱 网络安全盘符是啥意思 数据库if多个条件判断 哪个服务器一键部署最好用 计算机网络技术的应用案例 数据库工程师的证书有哪些 excel表数据复制到数据库 长沙智兔互联网科技有限公司 网警开展网络安全宣传周活动 arm软件开发前景怎么样 系统中如何加服务器安全 pb自带数据库 局域网 招标文件软件开发售后 手游基岩版进不了服务器 数据库不安全的因素主要有哪些 地下城手游服务器的规则 软件开发结合测试测试方法 网络安全岗位也要去派出所吗 宝塔安装数据库失败 网络安全盘符是啥意思 国家地理信息数据库包括哪些内容 长沙智兔互联网科技有限公司 电子商务与计算机网络技术的关系 汽车屏显示服务器错误 杭州明意网络技术有限公司 秦皇岛软件开发联系方式 刀塔自走棋服务器是日本
0