1. 程式人生 > 實用技巧 >Oracle-內部儲存機制(概念)

Oracle-內部儲存機制(概念)

事務

資料庫的事務:處理資料的最小的功能模組

begin
  執行語句;
end;

事務四個特性

原子性

獨立的最小的功能模組

一致性

一個模組中所有的事務應該同時成功或者失敗

隔離性

模組和事務之間不會互相影響都是完成各自的功能

永續性

資料應該是永久儲存的

鎖:一個人在操作某個資料的時候,另一個人不能對這個資料同時進行操作

分類

按修改的範圍分類

行鎖

A使用者update或者delete某行資料的時候,B使用者不能再去對這行資料做任何的更新

表鎖

A使用者update或者delete或者insert某行資料的時候,B使用者不能去對這個表的結構做修改的

按上鎖的主動性來分類

樂觀鎖

預設的日常操作就是樂觀鎖

悲觀鎖

不做DML操作,但是也要先對資料上鎖

select * from emp where empno=7369 for update;

死鎖

什麼是死鎖:多個不同的程序,在執行過程中,互相擁有和佔用了對方的資源,誰都無法先釋放出來

釋放鎖的操作:

v$locked_object 儲存所有當前資料庫的鎖的資料

v$session 儲存的登入使用者的資料

--1.在表v$locked_object中查詢是否存在鎖,如果存在鎖,查出其對應的物件id object_id 和序列id session_id
select * from v$locked_object; --object_id=74609,session_id=9

--2.根據鎖的物件id object_id 在表dba_objects中查詢鎖的具體資訊,可以看到鎖住的表名
select * from dba_objects where object_id=74609;

--3.根據鎖的序列id session_id 在表v$session中查詢上鎖使用者的登入序列號serial#
select * from v$session where sid=9; --serial#=2065

--4.根據 session_id,serial# 刪除對應的鎖資訊
alter system kill session '9,2065';

表分割槽

表分割槽:設定不同的規則,將相同規則的資料存放在一起,目的是節省資料檢索的時間

有分割槽內容的表叫做分割槽表。

2000W以上資料的表格,就設定分割槽。

分割槽表建立

--基本格式
create table 表名字(
    列名 資料型別 約束條件
)partition by 分割槽型別(列名)
(
 分割槽的規則
);

範圍分割槽

數值相關的列,時間相關的列 range

--基本格式:
create table 表名(
列名,資料型別,約束條件
...
)partition by range(列名)
(
partition 分割槽名 values less than(數值),
    ...
partition 分割槽名 vlaues less than(maxvalue)--其他
);
create table emp_range(
empno number,
ename varchar2(30),
job varchar2(30),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by range(sal)
(
    partition sal01 values less than(2000),
    partition sal02 values less than(3000),
    partition sal03 values less than(maxvalue)
);

列表分割槽

有大量重複值的固定資訊的列 list

--基本格式
create table 表名(
列名,資料型別,約束條件
...
)partition by list(列名)
(
partition 分割槽名 values(值),
    ...
);
create table emp_list(
empno number,
ename varchar2(30),
job varchar2(30),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by list(deptno)
(
    partition d10 values(10),
    partition d20 values(20),
    partition d30 values(30) 
);

雜湊分割槽

沒有任何規律的資料 hash 根據資料庫裡面的一個內建的雜湊演算法,進行資料的隨機劃分

--基本格式
create table 表名(
列名,資料型別,約束條件
...
)partition by hash(列名) partitions 分割槽數量;
create table emp_hash(
empno number,
ename varchar2(30),
job varchar2(30),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by hash(ename) partitions 4;

組合分割槽

用上面三種方法任意組合,將資料劃分的更加細緻

--基本格式
create table 表名(
列名,資料型別,約束條件
...
)partition by hash(列名) 
subpartition by range(列名)
(
partition 主分割槽名 values()
    (
    subpartition 副分割槽名 values less than(數值),
        ...
    ),
  ...
)
create table emp_complex(
empno number,
ename varchar2(30),
job varchar2(30),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by list(deptno)  --父分割槽
subpartition by range(sal)  --子分割槽
(
  partition dept10 values(10)
  (
    subpartition sal2000_10 values less than(2000),
    subpartition sal3000_10 values less than(3000),
    subpartition salmax_10 values less than(maxvalue)
  ),
  partition dept20 values(20)
  (
    subpartition sal2000_20 values less than(2000),
    subpartition sal3000_20 values less than(3000),
    subpartition salmax_20 values less than(maxvalue)
  ),
  partition dept30 values(30)
  (
    subpartition sal2000_30 values less than(2000),
    subpartition sal3000_30 values less than(3000),
    subpartition salmax_30 values less than(maxvalue)
  )
);

檢視分割槽的資訊

select * from user_tab_partitions;

新增新分割槽

alter table 表名 add partition 分割槽名 values 分割槽新增規則;

alter table emp_list add partition d40 values(40);

alter table sale_info add partition time20200918 values less than(date'2020-09-19');

合併分割槽

合併分割槽只能合併兩個相鄰的分割槽

--合併多個分割槽:分割槽的小的值和大的值要按順序排列
alter table 表名 merge partitions 分割槽名1,分割槽名2...  into partition 新的分割槽名;
alter table sale_info merge partitions TIME20200917,TIME20200918
into partition month09;

重新命名分割槽

alter table 表名 rename partition 分割槽名 to  新分割槽名;

alter table sale_info rename partition MONTH09_2 to MONTH09;

拆分分割槽

alter table 表名 split parition 分割槽名 at(date'2020-09-16')

into (partition time20200916, partition time202009);
alter table sale_info split partition TIME202009

at(date'2020-09-17')

into(partition time20200917, partition time20200918);

刪除分割槽

不能把所有的分割槽都刪除,至少留下一個

alter table 表名 drop partition 分割槽名;

alter table sale_info drop partition TIME20200918;

同義詞

建立同義詞

create public synonym 同義詞 for 另一個表表名;

create public synonym sal for scott.salgrade;

刪除同義詞

drop public synonym 同義詞;

drop public synonym sal;

序列

自動生成一組從大到小或者從小到大的一組數字 sequence

create sequence 序列名;

檢視當前序列的內容:  序列名.currval
使用序列的下一個值:  序列名.nextval

作用

一般是當成某個表的主鍵id使用的,每個大表都會有屬於自己的序列名字。

序列的屬性

create  sequence 序列名
start with 開始數字
increment by 增長數
maxvalue 最大值   |    nomaxvalue
minvalue 最小值    |    nominvalue
cycle  |   nocycle
cache  快取數量    |  nocache;

檢視

就是一個預定義的查詢語句,檢視就是一個虛擬的表

檢視的優點

  1. 簡化日常操作,將很長的sql語句簡化成一個單詞的名字

  2. 簡化業務,將其他部門需要列顯示出來即可

  3. 安全性更高,可以隱藏關鍵和敏感的欄位,加上只讀之後無法修改原表的資料

  4. 節省網路流量

檢視的缺點

隱藏內部邏輯程式碼,使用的人只能看到結果,不能知道真實情況

示例:a檢視由5張表連線,b檢視由6張表連線,這個時候a和b連線,就變成了一個很複雜的邏輯。當一個檢視與其他一個檢視聯表查詢的時候速度可能會非常慢。

建立檢視

create or replace view max_dname as
select dname from dept where deptno=
(select deptno from
(select deptno,count(1) c from emp group by deptno
order by c desc
)a
where rownum=1)
with read only;
  • create 建立檢視

  • replace 修改檢視的邏輯

  • with read only 禁止修改原表內容,如果不加的話,通過檢視可以對原表進行修改

create or replace view emp_3 as

select empno,ename,sal,comm,deptno from emp;

物化檢視

是一個真實的表格,將一個select語句的結果,儲存成一個真實的表格

快照表

建立物化檢視

create materialized view 物化檢視名字
refresh on [commit | demand]
start with (start_time) next (next_time)
as select查詢語句;

更新方式

跟隨原表一起更新 on commit

對原表進行DML操作,然後commit之後,物化檢視就會及時更新

create materialized view male_20_stu
refresh on commit
as
select * from students where ssex='男' and sage>20;

定時更新快照表的資料 on demand

原表改變後,不會立即更新,而是按照設定的時間進行更新

create materialized view female_20_stu
refresh on demand
start with sysdate 
next to_date(concat(to_char(sysdate+1,'yyyy-mm-dd'),' 8:00:00'),'yyyy-mm-dd hh24:mi:ss')
as
select * from students where ssex='女' and sage>20;

檢視和物化檢視的區別?

  1. 檢視是虛擬的表格,不會佔用我們的磁碟空間

  2. 物化檢視是真實的表格,會佔用我們的磁碟空間

  3. 檢視是隨著原表實時更新的,物化檢視有提交時更新和需求時更新兩種方法

  4. 查詢檢視實際上是查詢的原表,物化檢視是查詢的結果構成的新表

  5. 可以給物化檢視建立索引

手動更新on demand更新方式的更新結果

手動去更新on demand表格的方式

物化檢視手動更新方式:

  1. complete 表格全量更新
    先將表格中所有資料全部刪除,再將所有資料插入進入
  2. fast 表格的增量更新
    只對改變的資料進行更新
  3. force
    預設的更新方式(fast)
begin                  
    dbms_mview.refresh('物化檢視名字','更新方法');
end;

begin
  dbms_mview.refresh(
       'FEMALE_20_STU',
		'COMPLETE'
  );
end;

begin
  dbms_mview.refresh(
       LIST=>'FEMALE_20_STU',
       METHOD=>'COMPLETE',
       PARALLELISM=>4
  );
end;

--如果使用TAB指定表名的話,需要使用多個表名