bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

oracle11g中虛擬列有什么用

這篇文章將為大家詳細講解有關oracle11g中虛擬列有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

創新互聯是一家專注于網站設計制作、做網站與策劃設計,臥龍網站建設哪家好?創新互聯做網站,專注于網站建設10多年,網設計領域的專業建站公司;建站業務涵蓋:臥龍等地區。臥龍做網站價格咨詢:028-86922220

由于之前的一個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;
oracle11g中虛擬列有什么用
業務需求如下,統計買了單保險的有多少人,買了多保險的有多少人。因此我希望在此表單獨有一列對此人所買保險是單保險還是多保險做一個判斷。
此需求需要用到自定義函數,建立用戶自定義函數:
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中虛擬列有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

文章題目:oracle11g中虛擬列有什么用
文章URL:http://vcdvsql.cn/article6/pdedog.html

成都網站建設公司_創新互聯,為您提供營銷型網站建設網站導航微信小程序電子商務網站設計響應式網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都app開發公司