Oracle 第3章 鎖、表分區

 

Oracle 第2章 Oracle查詢、數據類型、函數
Oracle 第4章 同義詞、序列、視圖、索引

 

Oracle 第3章 鎖、表分區

 


1、技術目標

  • 理解鎖定的概念
  • 使用表分區


2、鎖定的概念

  • 多個用戶可同時訪問相同數據,鎖是數據庫用來控制共享資源併發訪問的機制
  • Oracle提供的鎖可以確保多用戶環境下數據的完整性、一致性
  • 鎖能用於保護正在被修改的數據
  • 在提交或回滾事務之前,Oracle會鎖定正在被修改的數據,直到提交或回滾了事務之後,鎖會自動釋放,其他用戶才能更新數據 例如:庫存中某商品只剩1件,某用戶正在在線訂購該商品,與該操作相關的數據,也就是這件商品的記錄可以鎖定,以防止其他用戶"同時購買"該商品而修改該記錄

大多數情況下,鎖不需要開發者干預 ,Oracle會自動完成鎖定,比如修改數據時,Oracle提供了鎖定操作,以便於需要顯示鎖定數據時使用。鎖定的特點如下:

  • 一致性:一次只允許一個用戶修改數據,以保證數據的統一
  • 完整性:提供正確的數據,某用戶所修改的數據會反映給所有其他用戶
  • 併發性:允許多用戶同時訪問同一數據,如,某用戶正在修改商品庫存時,其他用戶可以同時查看庫存信息,某用戶正在更新數據時,其他用戶就不能同時刪除該數據


3、鎖的類型

鎖有兩種類型:行級鎖 (用於特定行)、表級鎖 (用於整個表)

    3.1)行級鎖

    對正在被修改的行進行鎖定。其他用戶可以訪問其餘的行,如圖

   

    行級鎖是一種排他鎖 ,可防止其他事務修改行,但不會阻止讀取,
    在使用insert、update、delete以及select  ... for update等
    語句時,Oracle會自動應用行級鎖,select  ... for update
    語句可每次選擇多行記錄進行更新,這些記錄會被鎖定,直到
    回滾或提交該事務後鎖纔會釋放,其他用戶纔可編輯這些記錄
   
    select ... for update語句的完整語法如下:
    select ... for update [of 列名集合] [wait 秒數 | nowait];
    of子句指定需要鎖定的列
    wait子句指定等待其他用戶釋放鎖的時間(秒),防止無限期等待
   
    使用: 鎖定vencode爲V002的記錄中oDate和delDate兩列,然後再修改
    SELECT * FROM orderMaster WHERE vencode=’V002’
            FOR UPDATE OF oDate, delDate;
    UPDATE orderMaster SET delDate=’18-8月-08’ WHERE
    vencode=’V002’;
    COMMIT;--事務提交後釋放鎖定
   
    使用"for update wait"子句的優點有:

  • 防止無期限等待被鎖定的行
  • 可在應用程序中對鎖定的等待時間進行設置

   
    3.2)表級鎖

    表級鎖用於保護表數據,使用"lock table "語句顯示鎖定表。在事務處理中,
    表級鎖用來限制對錶的添加、更新和刪除等操作,具體語法如下:
    lock table 表名 in 鎖定模式 mode [nowait];
    nowait關鍵字可防止無限期等待其他用戶釋放鎖
    鎖定模式有如下內容:

  • 行共享(row share, rs):允許其他用戶訪問和鎖定表,禁止排他鎖定整個表
  • 行排他(row exclusive, rx):在行共享模式基礎上,禁止其他用戶在表上使用共享鎖
  • 共享(share, s):共享鎖將鎖定表,只允許其他用戶查詢表中的行,不允許添加、更新或刪除行,多個用戶可同時在同一表中設置共享鎖(允許資源共享) 例如,每天的結帳操作時需更新日銷售額表,可在更新該表示設置共享鎖以確保數據一致性
  • 共享行排他(share row exclusive, srx):比共享鎖更多的限制,防止其他事務在表上使用共享鎖、共享行排他鎖以及排他鎖
  • 排他(exclusive, x):對錶執行的最大限制,其他用戶只能查詢該表的記錄,該鎖防止其他事務對錶做任何更新或在表上設置任何類型的鎖

    使用: 以共享模式鎖定orderMaster表
    lock table orderMaster in share mode;
    注意:執行commit或rollback命令可釋放鎖定
   
    某用戶對錶鎖定時未使用nowait子句,如該表已被另外的用戶
    鎖定,那麼他將無限期等待,直到鎖定該表的用戶使用commit
    或rollback語句釋放鎖
   
4、死鎖

當兩個事務相互等待對方完成任務時,會出現死鎖。比如用戶A鎖定了對象
X,用戶B鎖定了對象Y,用戶A再鎖定Y,用戶B再鎖定X,兩位用戶需要等
待對方釋放鎖,此時兩個用戶處於僵持狀態,無法繼續處理業務,這種情況
Oracle會自動檢測死鎖,通過終止兩個事務之一來解決問題,如圖




死鎖在Oracle中極少出現,一般不用考慮此問題,可以通過人爲製造環境來
產生死鎖

5、表分區

Oracle可管理包含海量數據的表,如,公司的訂單表可能會增加到百萬行,
大小超過2GB,隨着表的增大,數據管理隨之變得困難,要查找某條記錄
需要搜索整個表,會消耗大量的系統資源和時間。Oracle提供的表分區技
術可改善系統性能

表分區允許用戶把一個表中的行分爲幾個部分,不同的部分還可存儲在不
同的位置。被分區的表稱爲分區表,劃分出的每一個部分成爲一個分區

表分區有許多優勢

  • 可改善表的查詢性能,在對錶進行分區後,用戶執行SQL查詢時可以只訪問表中的特定分區
  • 表更容易管理,因爲分區表的數據存儲在多個部分中,按分區加載和刪除數據比在表中加載和刪除更容易
  • 便於備份和恢復,可獨立備份和恢復每個分區
  • 提高數據安全性,將不同的分區分佈在不同的磁盤,可減小所有分區數據同時損壞的可能


應用程序不用知道表已分區,在更新和查詢分區表時和普通表的操作一
樣,但Oracle優化程序知道表已被分區

注意:要分區的表不能具有LONG和LONG ROW數據類型的列

Oracle提供4種分區方法:

  • 範圍分區
  • 散列分區
  • 複合分區
  • 列表分區


6、範圍分區

範圍分區根據表的某列或多列的值範圍,決定將數據存儲在哪個分區上,
比如,可根據序號分區,根據記錄的創建日期分區等

創建分區的語法,在create table語句中增加partition子句可創建分區表,
按範圍分區的語法爲:
create table 表名
(
    ......
)
partition by range (column_name)
(
    partition part1 value less than(range1) [tablespace tbs1],
    partition part2 value less than(range2) [tablespace tbs2],
    ...
    partition partN value less than(rangeN) [tablespace tbsN],
)
語法說明:
column_name 爲創建範圍分區的列,其列值稱爲分區鍵
part1 ... partN 爲分區名
range1 ... MAXVALUE 爲分區的邊界值
tbs1 ... tbsN 爲分區所在的表空間,tablespace是可選項

範圍分區注意事項:

  • 每個分區的邊界值必須小於下一個分區的邊界值
  • 每個分區中,只需指定其範圍的最大值
  • 所有行的分區鍵都要小於( < )該分區的邊界值
  • 最後一個分區中,MAXVALUE關鍵字代表邊界的最大值,Oracle使用這個分區來存儲前面幾個分區中不能存儲的數據,範圍的最小值由Oracle隱含定義


使用1: 購物商場根據銷售成本(salesCost)對Sales表中的數據進行分區,
每個分區有一個分區界限用以限制分區範圍,按邏輯範圍進行分區,
create table Sales
(
    productId varchar2(5),
    salesDate date not null,
    salesCost number(10)
)
partition by range(salesCost)
(
    partition P1 values less than (1000),
    partition P2 values less than (2000),
    partition P3 values less than (3000),
);
說明:
創建Sales表時創建了3個分區,P1分區包含銷售成本低於1000的所有
產品,P2分區包含銷售成本低於2000但高於或等於1000的所有產品

使用2: 分區列爲date數據類型的情況,必須使用年份爲4字符格式掩碼
的to_date()函數指定分區邊界,
create table sales2
(
    productId varchar2(5),
    salesDate date not null,
    salesCost number(10)
)
partition by range(salesDate)
(
    partition P1 values less than (to_date('2006-01-01', 'YYYY-MM-DD')),
    partition P2 values less than (to_date('2007-01-01', 'YYYY-MM-DD')),
    partition P3 values less than (MAXVALUE),
);
說明: 根據銷售日期將表分爲3個分區,第一個分區存儲2006年以前
的數據,第二個分區存儲2006年度的數據,第三個分區存儲2007年
以後的數據

7、散列分區

散列分區通過在分區鍵值上執行一個散列函數 來決定數據的物理位置,
在範圍分區中分區鍵的連續值通常存儲在相同的分區中,而散列分區
會把記錄平均分佈到不同的分區,減少磁盤I/O爭用的可能性,

散列分區需要用戶指定表所需的分區數目以及存儲分區的物理位置,
將散列算法應用於分區鍵後,散列分區會將數據分佈到適當的分區,
語法如下:
partition by hash (column_name)
partitions number_of_partitions [store in (tablespace_list)];
或者
partition by hash (column_name)
(
    partition part1 [tablespace tbs1],
    partition part2 [tablespace tbs2],
    ...
    partition partN [tablespace tbsN],
)
語法說明:
column_name 爲作爲基礎創建散列分區的列
number_of_partitions 爲分區數量,使用這種方式會自動生成分區名
tablespace_list 爲分區使用的表空間,如果分區數量超過表空間數量,
        分區會以循環的方式分配到表空間中
part1 ... partN 爲分區名

使用1: 創建Employee表,設置4個散列分區,department列爲分區鍵
create table employee
(
    empId number(4),
    empName varchar2(14),
    empAddress varchar2(15),
    department varchar2(10)
)
partition by hash(department) partitions 4;

使用2: 創建表MyEmp並設置2個散列分區
create table MyEmp
(
    eId number(4),
    eName varchar2(20)
)
partition by hash(empId)
(
    partition part1,
    partition part2
);

8、複合分區

複合分區是範圍分區和散列分區的結合,創建複合分區時,先按範圍對
數據進行分區,然後在這些分區內創建散列分區。複合分區即具有範圍
分區便於管理的特定,有具有散列分區在數據放置和並行操作方面的優勢

複合分區語法:
partition by range (column_name1)
subpartition by hash(column_name2)
subpartition number_of_partitions [store in (tablespace_list)]
(
    partition part1 value less than(range1),
    partition part2 value less than(range2),
    ...
    partition partN value less than(MAXVALUE),
);
語法說明:
column_name1
column_name2
number_of_partitions
part1 ... partN 爲分區名
range 爲範圍分區的邊界值

使用: 創建表Sales,設置複合分區,先根據salesDate列創建4個範
圍分區,再根據productId創建子分區,子分區採用散列分區,共創
建5個子分區,總共創建20個子分區
create table Sales
(
    productId varchar2(5),
    salesDate date not null,
    salesCost number(10)
)
partition by range(salesDate)
subpartition by hash(productId)
subpartitions 5
(
    partition P1 values less than(date '2008-03-01'),
    partition P2 values less than(date '2008-06-01'),
    partition P3 values less than(date '2008-09-01'),
    partition P4 values less than(MAXVALUE),
);

9、列表分區

列表分區允許用戶明確地控制行到分區的映射,列表分區允許按自然方式
對無序和不相關的數據集進行分組和組織,語法如下:
partition by list (column_name)
(
    partition part1 values (values_list1),
    partition part2 values (values_list2),
    ...
    partition partN values (DEFAULT)
);
語法說明:
column_name 爲創建列表分區的基礎列
part1 ... partN 爲分區名
values_list 爲對應分區的分區鍵值列表
DEFAULT 關鍵字爲允許存儲前面的分區不能存儲的記錄

使用: 根據職員住址對Employee表進行分區,north分區只包含地址
爲"遼寧"的記錄,如果用戶輸入的值是"廣東",則Oracle會拒絕該值,
因爲沒有創建可以包含該值的分區
create Employee
(
    empId number(4),
    empName varchar2(14),
    empAddress varchar2(15),
    department varchar2(10)
)
partition by list(empAddress)
(
    partition north values('遼寧'),
    partition west values('西藏', '青海'),
    partition south values('福建', '海南'),
    partition east values('江蘇', '上海')
);

10、按分區查詢、刪除記錄
使用1: 查詢表分區的記錄
select * from 表名 partition (分區名);

使用2: 刪除表分區的記錄
delete from 表名 partition (分區名);

11、分區維護

分區維護是指修改分區表的分區,比如可以向現有表添加新分區,將
分區移動到其他表空間中等等

某些分區維護操作時計劃事件,如在歷史數據庫中,數據庫管理員定
期從數據庫中刪除最舊的分區並添加一組新的分區,該刪除和添加操作
將定期執行

其他分區維護操作時費計劃事件,用於解決應用程序或系統問題,例如
意料之外的事務處理活動可能會迫使DBA拆分分區以便重新平衡I/O負載

部分分區維護操作如下:

  • 添加分區
  • 刪除分區
  • 截斷分區
  • 合併分區
  • 拆分分區

    11.1)添加分區
    alert table 表名 add partition 新分區名 values less than (邊界值);
    該語句用於在最後一個分區後添加新分區,如果要在表的開始或中間
    位置添加分區,或者最高分區的分區邊界是MAXVALUE,則應使用
    split partition語句
   
    11.2)刪除分區
    alter table 表名 drop partition 分區名;
    刪除分區會連分區中的數據一起刪除
   
    11.3)截斷分區
    alter table 表名 truncate partition 分區名;
    截斷分區會刪除表分區中的所有記錄

    11.4)合併分區
    alter table 表名
    merge partitions 分區名1, 分區名2
    into 新分區名;
    可將範圍分區或複合分區表的兩相鄰分區連接起來,合併後的
    分區將繼承兩個分區的較高上界

    11.5)拆分分區
    alter table 表名
    split partition 分區名 at (邊界值)
    into (partition 新分區名1, partition 新分區名2);
    可在表的開頭或中間添加分區,拆分分區允許用戶將一個分區
    拆分爲兩個分區,當分區過大時可對分區進行拆分
   
    使用:將Sales表的P3分區拆分爲P31和P32兩個分區,原P3分區
    存儲2007年以後的數據,拆分爲兩個分區,一個存放2007年度數
    據,另一個存放2008年以後的數據
    alter table Sales split partition P3 at (date '2008-01-01')
    into (partition P31, partition P32);

12、總結

  • 鎖用於保護多用戶環境下被修改的數據
  • 鎖分爲兩種級別,即行級鎖和表級鎖
  • 表分區允許將一個表劃分成幾部分,以改善大型應用系統的性能
  • 分區方法包括範圍分區、散列分區、複合分區和列表分區
  • 分區維護操作包括添加、刪除、截斷、合併和拆分分區

 

Oracle 第2章 Oracle查詢、數據類型、函數
Oracle 第4章 同義詞、序列、視圖、索引

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章