<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    散列簇學習
    ?
    ??? 散列簇這個東西,說實話我也不知道有什么用處,很少會用到。既然看到這里,就學習一下,貌似這個功能是用來處理表的一些索引結構的,實在是看了頭大,記下來再說,以后有需要了再慢慢看吧。
    ?
    一、散列簇的適用環境
    ?
    ??? 散列簇是一種為非簇表提供索引或索引簇的一種方法,它將表存儲到一個散列簇,可以改善數據檢索的性能。對于索引表或索引簇,Oracle使用存儲在單獨的索引中的鍵值來定位表中的行。Oracle會物理地將表中的行存儲到散列簇,并根據散列函數的結果來檢索它們。
    ?
    ??? Oracle使用散列函數來產生散列值(基于特殊的簇鍵值的數字值分布)。散列簇建類似索引簇的鍵,可以是單個列或組合列。為了在散列簇中查找或存儲行,Oracle將散列函數應用到行的簇鍵值。產生的散列值對應于簇中的數值塊,然后Oracle根據發布的語句在這些數據塊上讀寫。
    ?
    ??? 在簇表或簇中查詢存儲行時,至少需要執行兩個I/O(索引中以及表中的讀寫),而使用散列函數在散列簇中定位行時不需要I/O,所以至少需要1次I/O。
    ?
    ??? 注:即使決定使用散列方法,表仍然可以在任何列(包括簇鍵)上具有單獨的索引。
    ?
    1、散列方法有用的情況
    ?
    ??? * 大多數查詢是在簇鍵上的相等查詢
    ??? SELECT ... WHERE cluster_key = ... ;
    ??? 此時相等條件被散列,并且通常讀一次就能找到對應散列鍵。對比索引表則需要先在索引中找到其鍵值,再從表中讀行。
    ?
    ??? * 散列簇中的表的大小是基本不變的
    ??? 此時可以確定簇中表的行數及其所需空間,如果散列簇中表需要比初始分配更多的空間,則性能將會降低(使用溢出數據塊)。
    ?
    2、散列方法無益的情況
    ?
    ??? * 表上大多數查詢是在簇鍵值的一個范圍中檢索
    ??? SELECT ... WHERE cluster_key < ... ;
    ??? 范圍無法被散列,只能全表掃描,而索引是可以將鍵值排序的
    ?
    ?? * 表不是靜止的,而是經常增長的
    ?
    ??? * 應用經常對表進行全表掃描,并且很少填充表
    ??? 此情況下散列方法的全表掃描需要更長時間
    ?
    ?? * 無法提供散列簇最終需要的與分配空間
    ?
    ?
    二、創建散列簇
    ?
    ??? CREATE CLUSTER trial_cluster (trialno NUMBER(5,0))
    ??? PTCUSED 80
    ??? PCTFREE 5
    ??? TABLESPACE users
    ??? STORAGE (INITIAL 250K NEXT 50K
    ??? MINEXTENTS 1 MAXEXTENTS 3
    ??? PCTINCREASE 0)
    ??? HASH IS trialno HASHKEYS 150;
    ?
    ??? CREATE TABLE trial (
    ??? trialno NUMBER(5,0) PRIMARY KEY,
    ??? ...)
    ??? CLUSTER trial_cluster (trialno);
    ?
    ??? 說明:
    ??? 1.HASHKEY值指定和限制該簇所使用的散列函數可以產生的唯一的散列值數量(Oracle會取最接近的素數)
    ??? 2.如果沒有HASH IS子句,Oracle就會使用內部散列函數。
    ??? 3.在散列簇上不能創建索引,也不需要在散列簇鍵上創建索引
    ?
    1、創建單個表散列簇
    ?
    ??? 單個表散列簇提供了對表中的行的快速訪問。必須在散列鍵和數據行之間存在一對一的映射。
    ?
    ??? CREATE CLUSTER peanut (variety NUMBER)
    ??? SIZE 512 SINGLE TABLE HASHKEY 500;
    ?
    ??? 注:SINGLE TABLE 選項僅對散列簇有效,且必須指定HASHKEYS
    ?
    2、控制散列簇的空間使用
    ?
    ??? ① 選擇鍵
    ??? 選擇正確的簇鍵取決于針對簇表所發布的最常用的查詢類型(看最常用那個鍵來選擇行)。
    ??? 最典型的簇鍵就是包含表的整個主鍵。
    ?
    ??? ② 設置HASH IS
    ??? 僅當簇鍵是NUMBER數據類型、包含均勻分布的整數的單個列時,才指定HASH IS參數。
    ?
    ??? ③ 設置SIZE
    ??? 應將SIZE設置成為保持任何給定散列鍵的所有行所需的空間的平均數
    ??? * 若散列簇僅包含單個表,且表中行的散列鍵值唯一,則SIZE為簇中平均的行大小
    ??? * 若散列簇包含多個表,則設置SIZE為:為保持與代表性的散列值相關的所有行所需的空間平均數
    ??? * 若散列簇不使用內部散列函數,且期望很少或沒有沖突,則使用SIZE初始值
    ??? * 若預料到插入時經常沖突,則為了存儲行而分配溢出數據塊的高可用性,按需要適當增加SIZE
    ???
    ??? ④ 設置HASHKEYS
    ??? 為散列簇中行的最大分布,且Oracle會自動舍入到最近素數
    ?
    3、控制散列簇的空間舉例
    ???
    ??? 假設數據塊大小為2K,平均每個數據塊可用數據空間為1950B
    ?
    ??? 例1:
    ??? 現打算將emp表裝載進一個散列簇,大多數查詢按職員號碼檢索職員記錄,你估計,在任何給定時間中emp表最大的行數是10000,且平均行大小是55字節。
    ?
    ??? 此時應將empno作為簇鍵,因為該列包含唯一整數,所以可不使用內部散列函數。SIZE可被設置成平均行大小(55字節)。注意,給每個數據塊賦予了34個散列鍵。HASHKEYS可被設置成表中的行數(10000)。Oracle自動轉換為最接近的素數(10007)。
    ?
    ??? CREATE CLUSTER emp_cluster (empno NUMBER)
    ??? ...
    ??? SIZE 55
    ??? HASH IS empno HASHKEYS 10000;
    ?
    ?
    ??? 例2:
    ??? 按部門號碼進行檢索行,其他條件類似。且每個部門平均10個職員,部門號碼按10遞增(0,10,20,30,...)
    ?
    ??? 此時應將deptno作為簇鍵,又因為該列包含均勻分布整數,所以可以不使用內部散列函數。SIZE的初始值是55字節*10,因此每個數據塊被賦予3個散列鍵。如果預料到某些沖突,且希望數據檢索的性能最好,可稍微更改所估計的SIZE值,以預防需要溢出數據塊而帶來沖突,調整12%的SIZE到620字節
    ??? HASHKEYS可以被設置成唯一的部門號碼的個數(1000),Oracle自動轉換為最接近的素數(1009)。
    ?
    ??? CREATE CLUSTER emp_cluster (deptno NUMBER )
    ??? ...
    ??? SIZE 620
    ??? HASH IS deptno HASHKEYS 1000;
    ?
    4、估計散列簇所需的空間大小
    ?
    ??? 依據SIZE和HASHKEYS的設置值,Oracle保證最初分配的空間足夠存儲散列表。如果對INITIAL、NEXT、MINEXTENTS的設置值不能滿足簇的大小,則分配增加的盤區直到至少滿足 SIZE*HASHKEYS
    ?
    ??? 例如:假設數據塊大小為2K,每個數據塊可用數據空間大約為1900字節,且CREATE CLUSTER語句中指定如下:
    ??? STORAGE (INITIAL 100K
    ??? NEXT 150K
    ??? MINEXTENTS 1
    ??? PCTINCREASE 0)
    ??? SIZE 1500
    ??? HASHKEYS 100
    ?
    ??? 則以上例子中每個數據塊僅可賦予一個散列鍵,因此散列簇所需的初始空間至少是100*2K,所以設置的存儲參數無法滿足需求。因此需要分配給該散列簇一個100K的出示盤曲和一個150K的第2盤區。
    ?
    ??? 如果HASH參數指定為:
    ??? SIZE 500 HASHKEYS 100
    ??? 則此時可以給每個數據塊賦予3個散列鍵,此時需要的初始化空間是34*2K,可以滿足需求。
    ?
    ?
    三、更改散列簇
    ?
    ??? ALTER CLUSTER emp_dept ...;
    ??? --與簇相同
    ?
    ?
    四、刪除散列簇
    ?
    ??? DROP CLUSTER emp_dept;
    ??? --與簇相同
    ?
    ?
    五、散列簇相關信息
    ?
    ??? DBA|ALL|USER_CLUSTERS:該視圖包含了散列簇
    ??? DBA|USER_CLU_COLUMNS:該視圖包含了散列簇
    ??? DBA|ALL|USER_CLUSTER_HASH_EXPRESSIONS:列出用于散列簇的散列函數
    ?
    ?
    posted on 2009-03-18 22:23 decode360 閱讀(262) 評論(0)  編輯  收藏 所屬分類: 08.DBA
    主站蜘蛛池模板: 456亚洲人成影院在线观| 一级毛片在线播放免费| 日本免费电影一区| 永久免费无码网站在线观看个| 亚洲午夜久久久久妓女影院| 久久永久免费人妻精品| 亚洲综合成人婷婷五月网址| 亚洲精品视频免费观看| 99久久久精品免费观看国产| 羞羞视频免费网站含羞草| 亚洲最大的成网4438| 啊v在线免费观看| 久久99国产综合精品免费| 看Aⅴ免费毛片手机播放| 亚洲AV无码成人网站久久精品大 | 亚洲AV无码一区二区三区电影| 在线观看国产区亚洲一区成人| 亚欧在线精品免费观看一区| 深夜久久AAAAA级毛片免费看| 亚洲精品免费在线观看| 国产美女精品久久久久久久免费 | 水蜜桃亚洲一二三四在线| 国产精品公开免费视频| 99精品一区二区免费视频| 男女污污污超污视频免费在线看| 91情国产l精品国产亚洲区| 亚洲成av人片一区二区三区| 免费黄色福利视频| 免费无码又爽又刺激高潮软件 | 免费在线黄色电影| 免费无码午夜福利片| 日韩亚洲人成在线| 亚洲午夜久久影院| 亚洲色偷拍另类无码专区| 国产精品视频免费一区二区三区| 精品国产免费人成电影在线观看| 中文字幕免费在线看| 男性gay黄免费网站| 亚洲色精品三区二区一区| 亚洲国产av高清无码| 亚洲av中文无码乱人伦在线r▽ |