海量數據庫及分區1

原規劃本課的內容爲表分區,即單級分區表的簡要知識,規劃爲一課。由於近年來行業內海量數據處理人才緊缺,現根據讀者反饋將內容調整爲四課,以詳細討論海量數據庫的全部主要知識,並輔以大量實踐練習,以期有志於研究學習VLDB的讀者通過加量的課程學習能達到建立起VLDB基礎理論體系,迅速適應相應的海量數據庫設計和開發工作的效果。
 
VLDB概述

引子
很多現代企業如電子商務企業需要頻繁的在一個包含數百個GB或者數個TB數據的數據庫上運行關鍵任務。這種數據庫稱爲超大型數據庫(VLDB,Very Large Databases,又稱海量數據庫),其中的數據稱爲海量數據。
實踐中,VLDB一般包含兩個關鍵要素:一是用戶達到百萬級甚至千萬級,數據庫的容量一般超過1TB(1TB=1024GB);二是系統必須提供實時響應功能,不能停機、具有高度的可靠性和可擴展性。例如亞馬遜、淘寶、蘇寧易購等系統的數據庫。
對於VLDB的支持和維護的挑戰工作催生了海量數據解決方案。VLDB的主要主題中,最關鍵的方法一般是使用分區、壓縮、並行執行等技術。
分區簡介
分區是將一個超大表或者索引分解成若干個更小、更易於管理的小的部分,這些小的部分稱爲分區。對於表而言稱爲分區表,對於索引而言稱爲分區索引。原來對超大表或超大索引的SQL查詢和DML無需進行任何修改即可訪問這些分區表和分區索引。定義了分區後, DDL語句就只訪問和操縱單個分區,而不 是整個表或索引,因而分區帶來了高可維護性的好處。
分區的一個基本要求是表或索引的每個分區具有 相同邏輯屬性,如列名、約束等;但不同的分區可以具有不同的物理屬性,如壓縮的啓用/禁用,物理存儲設置、表空間等。對於許多不同類型的應用,尤其是管理大量數據的應用程序而言分區是非常有用的,如對於OLTP分區可提高其可管理性和可用性、性能,而對於數據倉庫分區則可提高其性能和可管理性。
分區的優點如下:
 
 顯著縮短操作處理時間:這些操作包括數據裝載、索引的創建和重建、備份與恢復。能顯著縮短的原因是這些操作僅限於分區級(在個體的分區上),而非表級(在整個表上)
 提高查詢響應性能:通常的查詢只需要訪問分區的一個子集即可完成,從而避免了訪問整個表。這種技術稱爲分區裁剪,其對性能的提升可以達到量級單位
 顯著縮短因維護操作導致的計劃宕機時間:分區是獨立於分區維護操作的,因此允許在表的不同分區或索引不同的分區上執行併發維護操作。如可以對分區執行併發的SELECT和DML語句等維護操作,其二者不會相互影響
VLDB與分區
    海量數據庫沒有最小的絕對大小,VLDB雖然類似於一個小型數據庫,但管理一個VLDB依然存在很多挑戰,這些挑戰與執行操作的數據庫的 絕對規模及其 成本效用是有關係的。數據庫大小的穩步增長與以下幾個趨勢因素有關:
 系統開發的獨立性和綜合合併應用需求的驅動:每個系統獨立開發,但跨部門的綜合應用需要數據庫和應用進行整合合併,而整合帶來的一個是基礎數據和存儲結構的不統一,二就是導致數據庫大小的持續增長
 法律法規的規定:法律法規要求存儲最小時間粒度的數據並保存一個較長時間,如日誌信息、交易信息等
 客戶公司發展因素:如公司的增長髮展、收購等導致用戶規模和業務規模的增長,這些均能帶來數據規模和併發規模的增長
    分區策略是管理超大容量數據庫的一個核心特性。分區地址的增長是VLDB的最基本挑戰之一,Oracle使用“分而治之”的技術策略管理數據庫中的表和索引,當這些表和索引增長時,該技術非常有效。分區的一個特性是當管理一個超大容量數據庫時,無需投入更多的管理資源和硬件資源即可提供具有高度可伸縮性和統一的可靠數據庫性能的數據庫服務。
Oracle建議,哪怕小規模數據庫(以MB爲單位)也可以分區,分區同樣能獲得與以TB爲單位的VLDB相同的性能和高可維護性。因此從這個角度觸發,建議對每個大數據表均進行分區,亦即分區是數據庫優化的一個重要手段。
分區基礎知識概覽
 
1.分區的基本知識
 數據庫管理員的角度
來看,一個分區的對象有多個塊,可以集體管理或單獨管理,這賦予管理員在管理分區對象相當大的靈活性。
 應用程序的角度來看,一個分區表,非分區表完全相同,使用SQL查詢和DML語句訪問分區表時,無需作任何修改。
 
 
2.分區鍵
  分區表的行必須明確的存儲在單一的分區,分區鍵可以由一個或多個列組成,用來決定行所存儲的分區,Oracle使用分區鍵來自動確定Insert、Update、Delete操作所對應的分區。
  如課程“索引及優化之表分析”中“用戶交易表”基於年度、月度和日期建立分區,則該三列構成分區鍵,用來決定DML操作對應的分區。
 
3.分區表
  表可以被分割爲無數個分區,但如果表中包含LONG或LONG RAW類型的列是則不可分區,而CLOB和BLOB類型的列是支持分區的。
  爲了減少磁盤和內存使用情況(特別是高速緩存),可以將表和分區的分區表進行壓縮,表壓縮 也可以大大節約存儲空間、加快查詢執行速度。 然而,有輕微的增加CPU的負擔。壓縮適合的情況 是數據倉庫環境,即讀多寫少的情況。
建議考慮使用表分區的情形
(1).表的大小超過2GB時,或超過2000萬行記錄時
  (2).表中包含歷史數據,新數據會被寫入新分區時
  (3).表的內容必須被分佈在不同類型的存儲設備時
 
建議考慮使用索引分區的情形
(1).對錶數據進行遷移並且希望避免重建索引時
  (2).對部分數據進行維護,而不希望維護期間使整個索引無效時
  (3).減少索引中具有單一遞增值的列引起的索引偏移時
4.分區與LOB類型數據
LOB類型列中存儲的非結構化數據(圖片、文檔等)也能分區。當進行分區時,LOB類型的列存儲在子集的表空間,且列存儲在分區所在的表空間中。此技術在存儲有大對象數據且不經常更新,而其他數據會經常被更新時非常高效,原因是將大對象數據與主數據進行了分離的存儲。如員工記錄數據,照片是大對象。
 
分區的好處
1.提高性能
分區通過限定操作數據的數量、對並行執行的數據是分佈式的,因此帶來了成倍的性能提升,主要包括:
(1).分區修剪
   分區修剪是最簡單也是最本質的性能提高手段,原因是限定了數據範圍。常常可以將查詢性能提高几個數量級。如某個訂單表按月分區,該表中存有2年的數據,現在查詢某個月度的訂單數,則只需訪問訪問一個分區,而不是24個分區,因此性可能會提升20倍。
(2).智能化分區連接
  多表連接時,該技術能在下列兩種情形下會得到應用
  1).A表與B表連接,A表的鍵是colS,B表的鍵也是colS,兩個表的分區均是基於列colS,且連接條件是A.colS= A.colS
  2).參考完整性中的參考分區表與其父表連接
  此時智能化分區連接技術能將一個大的連接打破使用一個小的連接,從而節省時間。
該技術無論是在串行化的還是在並行化的執行中具有重要意義。
2.易管理性
  由於分區後的存儲是單個單元的,也就是提供了“分而治之”的管理方式,因此可以對單個分區而不是整個表進行維護操作,如備份等。
3.可用性
  不同的分區是獨立的,因此提供可高可用性。如某個分區損壞,但其他分區依然可以使用,而不是整個表不能被使用。
每個分區也可以存儲在不同的表空間中,每個分區也可以設置不同的存儲參數。
分區策略概述
Oracle分區提供了三種基本的數據分區方法作爲基本的分區策略,控制如何將數據放入單獨的分區:
l範圍Range
l哈希Hash
l列表List
使用三種基本的分區方法,表可以被分區成單一分區列表或複合分區表,分別稱爲單級分區和組合分區。
       每個分區策略都有不同的優點和設計考慮。 因此,不同的策略適合不同特定的情況。
分區表
環境準備
1.先備份前面的30課的數據
2.只准備使用表ACCOUNT_TRADE中的數據
  
  
 
  
  
單級分區
使用範圍、哈希、列表三種分區策略的任何一中,在表的一個或多個列上建立分區。 
1.範圍分區策略-策略說明
    依據分區鍵值的範圍不同進行分區,當數據在範圍內均衡分佈時,性能最好,是最常見的分區策略,一般與日期相關。
該策略的每個分區均具有一個VALUES LESS THAN子句,用來指定該分區包含的範圍數據的上限。任何分區鍵的值大於等於該值時被添加到下一個更高的分區。 所有分區,除了第一個,有一個隱含的下限爲前一個分區的VALUES LESS THAN值。此外,包含一個MAXVALUE用來義爲最高的分區。 MAXVALUE代表一個虛擬的無限大的值,包括NULL值。
1.範圍分區策略—語法
   
 
 
1.範圍分區策略—語法注意事項
   如果基於多個列創建分區,列之間用逗號分隔;值部分也是用逗號分隔,且該值必須與列的類型相同。值部分也可以使用函數,如TO_DATE等。還要注意LESS THAN相當於小於號(<),如:
partition by range(ND,YD ) (
  partition ACCOUNT_TRADE_SR_P201001 values less than(2010,'02'),
  partition ACCOUNT_TRADE_SR_P201002 values less than(2010,'03'),
  partition ACCOUNT_TRADE_SR_P201003 values less than(2010,'04'),
  partition ACCOUNT_TRADE_SR_P201004 values less than(2010,'05'),
  partition ACCOUNT_TRADE_SR_P201005 values less than(2010,'06'),
  partition ACCOUNT_TRADE_SR_P201006 values less than(2010,'07'),
  partition ACCOUNT_TRADE_SR_P201007 values less than(2010,'08'),
  partition ACCOUNT_TRADE_SR_P201008 values less than(2010,'09'),
  partition ACCOUNT_TRADE_SR_P201009 values less than(2010,'10'),
  partition ACCOUNT_TRADE_SR_P201010 values less than(2010,'11'),
  partition ACCOUNT_TRADE_SR_P201011 values less than(2010,'12'),
  partition ACCOUNT_TRADE_SR_P201012 values less than(2011,'01'),
  partition ACCOUNT_TRADE_SR_PMORE   values less than(MAXVALUE,MAXVALUE));
 
1.範圍分區策略—示例體驗
l 創建一個結構類似表ACCOUNT_TRADE的單級範圍分區表ACCOUNT_TRADE_SR
l從表ACCOUNT_TRADE讀取2010年的數據寫入表ACCOUNT_TRADE_SR
l分析表ACCOUNT_TRADE_SR
l查看分區數據並將兩個表的數據進行對比
 
參見附件腳本3

1.範圍分區策略—示例體驗
 
 
  
 
2.散列分區策略-策略說明
    依據Oracle的散列分區算法將數據映射到分區上,該算法不可人工改變。散列分區會盡量將數據均勻的分佈在不同的分區上。當業務數據中沒有歷史數據時,選擇散列分區是一個比較好的替代方法。這個分區方法能夠保持I/O平衡,但是不可用於範圍查詢或不等式查詢。
    注意:Oracle推薦Hash分區的分區數是2的冪,如2、4、8、16等。
 
2.散列分區策略-語法
 
2.散列分區策略-語法注意事項
    單獨散列分區(individual_hash_partitions)及其限制使用子名按照名字指定單個分區,分區名可以匆略。此時能指定的唯一子句是表空間。
按照數量的散列分區(hash_partitions_by_quantity)可以指定分區的數目,Oracle此時指定分區的名字SYS_Pn。STORE IN子句指定分區所分佈的表空間的名稱。表空間的數目不一定和分區的數目相等。如果分區的數目比表空間的數目大,則分區按照名稱循環使用表空間。如果在按數量分區時指了STORE IN和分區存儲子句的表空間,則SOTRE IN指定了表創建分區的位置,TABLESPACE子句指定隨後操作的缺省表空間。此時語句partitions後面只能跟數字,一般爲2的冪,否則會引起ORA-14152錯誤。
2.散列分區策略—按照數量分區示例體驗
表爲ACCOUNT_TRADE_SHQ,方法同前面,分區語句如下:
 
partition by hash
 ( JYSJ  )
    partitions 4  store in
    (
         TS_ORALEARN,
         TS_ORALEARN_IDX
    );
 
參見附件腳本4
 
 
2.散列分區策略—單獨散列分區示例體驗
表爲ACCOUNT_TRADE_SHI,方法同前面,分區語句如下:
 
partition by hash( JYSJ  )(
        partition  ACCOUNT_TRADE_SHI_P1
             tablespace TS_ORALEARN,
        partition  ACCOUNT_TRADE_SHI_P2
              tablespace TS_ORALEARN_IDX,
        partition  ACCOUNT_TRADE_SHI_P3
              tablespace TS_ORALEARN,
        partition   ACCOUNT_TRADE_SHI_P4
              tablespace TS_ORALEARN
    );
 
參見附件腳本5
  
 
3.列表分區策略-策略說明
    列表分區通過爲分區鍵指定一系列離散的值(即枚舉值)來明確的控制行數據的存儲分區,其優點是可以將一些無序和不相關的數據組織在一起。如,銀行系統的數據可以按區域分區。
每個分區的list_values_clause(參見語法說明部分)最少有一個值。空值可能在多個分區中出現。你可以指定一個缺省分區,且缺省分區是定義分區的最後一個。 list_values_clause的每個值在表的所有分區必須唯一。
 
3.列表分區策略-語法
   
3.列表分區策略—示例體驗
表爲ACCOUNT_TRADE_SL,方法同前面,分區語句如下:
partition by list ( ND  )
    (
        partition ACCOUNT_TRADE_SL_P2010
        values ( 2010  )
  tablespace TS_ORALEARN,
        partition ACCOUNT_TRADE_SL_P2011
        values ( 2011  )
  tablespace TS_ORALEARN,
        partition ACCOUNT_TRADE_SL_PD
        values ( DEFAULT  )
  tablespace TS_ORALEARN_IDX
    );
 
 
 
參見附件腳本6
  
 
習題
1.什麼是海量數據庫,海量數據庫具有那幾個顯著特徵?
海量數據庫中最常使用的技術策略包括那幾種?
2.簡要說分分區的理論原理,其邏輯存儲特性和物理存儲特性分別是什麼?
3.請分別舉例說明分區顯著能縮短操作處理時間、提高查詢性能、減少週期性維護的宕機時間三大特性。
4.畫圖並分別從數據庫管理員角度和應用程序角度來看其特性。
5.對於設計人員或者管理員,什麼情形下應該考慮對錶進行分區?
 
轉載請註明私塾在線【 http://sishuok.com/forum/blogPost/list/0/6408.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章