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

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

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

    Decode360's Blog

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

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
      302 隨筆 :: 26 文章 :: 82 評(píng)論 :: 0 Trackbacks
    散列簇學(xué)習(xí)
    ?
    ?
    一、散列簇的適用環(huán)境
    ?
    ??? 散列簇是一種為非簇表提供索引或索引簇的一種方法,它將表存儲(chǔ)到一個(gè)散列簇,可以改善數(shù)據(jù)檢索的性能。對(duì)于索引表或索引簇,Oracle使用存儲(chǔ)在單獨(dú)的索引中的鍵值來定位表中的行。Oracle會(huì)物理地將表中的行存儲(chǔ)到散列簇,并根據(jù)散列函數(shù)的結(jié)果來檢索它們。
    ?
    ??? Oracle使用散列函數(shù)來產(chǎn)生散列值(基于特殊的簇鍵值的數(shù)字值分布)。散列簇建類似索引簇的鍵,可以是單個(gè)列或組合列。為了在散列簇中查找或存儲(chǔ)行,Oracle將散列函數(shù)應(yīng)用到行的簇鍵值。產(chǎn)生的散列值對(duì)應(yīng)于簇中的數(shù)值塊,然后Oracle根據(jù)發(fā)布的語句在這些數(shù)據(jù)塊上讀寫。
    ?
    ??? 在簇表或簇中查詢存儲(chǔ)行時(shí),至少需要執(zhí)行兩個(gè)I/O(索引中以及表中的讀寫),而使用散列函數(shù)在散列簇中定位行時(shí)不需要I/O,所以至少需要1次I/O。
    ?
    ??? 注:即使決定使用散列方法,表仍然可以在任何列(包括簇鍵)上具有單獨(dú)的索引。
    ?
    1、散列方法有用的情況
    ?
    ??? * 大多數(shù)查詢是在簇鍵上的相等查詢
    ??? SELECT ... WHERE cluster_key = ... ;
    ??? 此時(shí)相等條件被散列,并且通常讀一次就能找到對(duì)應(yīng)散列鍵。對(duì)比索引表則需要先在索引中找到其鍵值,再從表中讀行。
    ?
    ??? * 散列簇中的表的大小是基本不變的
    ??? 此時(shí)可以確定簇中表的行數(shù)及其所需空間,如果散列簇中表需要比初始分配更多的空間,則性能將會(huì)降低(使用溢出數(shù)據(jù)塊)。
    ?
    2、散列方法無益的情況
    ?
    ??? * 表上大多數(shù)查詢是在簇鍵值的一個(gè)范圍中檢索
    ??? SELECT ... WHERE cluster_key?< ... ;
    ??? 范圍無法被散列,只能全表掃描,而索引是可以將鍵值排序的
    ?
    ??? * 表不是靜止的,而是經(jīng)常增長的
    ?
    ??? * 應(yīng)用經(jīng)常對(duì)表進(jìn)行全表掃描,并且很少填充表
    ??? 此情況下散列方法的全表掃描需要更長時(shí)間
    ?
    ??? * 無法提供散列簇最終需要的與分配空間
    ?
    ?
    二、創(chuàng)建散列簇
    ?
    ??? 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值指定和限制該簇所使用的散列函數(shù)可以產(chǎn)生的唯一的散列值數(shù)量(Oracle會(huì)取最接近的素?cái)?shù))
    ??? 2.如果沒有HASH IS子句,Oracle就會(huì)使用內(nèi)部散列函數(shù)。
    ??? 3.在散列簇上不能創(chuàng)建索引,也不需要在散列簇鍵上創(chuàng)建索引
    ?
    1、創(chuàng)建單個(gè)表散列簇
    ?
    ??? 單個(gè)表散列簇提供了對(duì)表中的行的快速訪問。必須在散列鍵和數(shù)據(jù)行之間存在一對(duì)一的映射。
    ?
    ??? CREATE CLUSTER peanut (variety NUMBER)
    ??? SIZE 512 SINGLE TABLE HASHKEY 500;
    ?
    ??? 注:SINGLE TABLE 選項(xiàng)僅對(duì)散列簇有效,且必須指定HASHKEYS
    ?
    2、控制散列簇的空間使用
    ?
    ??? ① 選擇鍵
    ??? 選擇正確的簇鍵取決于針對(duì)簇表所發(fā)布的最常用的查詢類型(看最常用那個(gè)鍵來選擇行)。
    ??? 最典型的簇鍵就是包含表的整個(gè)主鍵。
    ?
    ??? ② 設(shè)置HASH IS
    ??? 僅當(dāng)簇鍵是NUMBER數(shù)據(jù)類型、包含均勻分布的整數(shù)的單個(gè)列時(shí),才指定HASH IS參數(shù)。
    ?
    ??? ③ 設(shè)置SIZE
    ??? 應(yīng)將SIZE設(shè)置成為保持任何給定散列鍵的所有行所需的空間的平均數(shù)
    ??? * 若散列簇僅包含單個(gè)表,且表中行的散列鍵值唯一,則SIZE為簇中平均的行大小
    ??? * 若散列簇包含多個(gè)表,則設(shè)置SIZE為:為保持與代表性的散列值相關(guān)的所有行所需的空間平均數(shù)
    ??? * 若散列簇不使用內(nèi)部散列函數(shù),且期望很少或沒有沖突,則使用SIZE初始值
    ??? * 若預(yù)料到插入時(shí)經(jīng)常沖突,則為了存儲(chǔ)行而分配溢出數(shù)據(jù)塊的高可用性,按需要適當(dāng)增加SIZE
    ???
    ??? ④ 設(shè)置HASHKEYS
    ??? 為散列簇中行的最大分布,且Oracle會(huì)自動(dòng)舍入到最近素?cái)?shù)
    ?
    3、控制散列簇的空間舉例
    ???
    ??? 假設(shè)數(shù)據(jù)塊大小為2K,平均每個(gè)數(shù)據(jù)塊可用數(shù)據(jù)空間為1950B
    ?
    ??? 例1:
    ??? 現(xiàn)打算將emp表裝載進(jìn)一個(gè)散列簇,大多數(shù)查詢按職員號(hào)碼檢索職員記錄,你估計(jì),在任何給定時(shí)間中emp表最大的行數(shù)是10000,且平均行大小是55字節(jié)。
    ?
    ??? 此時(shí)應(yīng)將empno作為簇鍵,因?yàn)樵摿邪ㄒ徽麛?shù),所以可不使用內(nèi)部散列函數(shù)。SIZE可被設(shè)置成平均行大小(55字節(jié))。注意,給每個(gè)數(shù)據(jù)塊賦予了34個(gè)散列鍵。HASHKEYS可被設(shè)置成表中的行數(shù)(10000)。Oracle自動(dòng)轉(zhuǎn)換為最接近的素?cái)?shù)(10007)。
    ?
    ??? CREATE CLUSTER emp_cluster (empno NUMBER)
    ??? ...
    ??? SIZE 55
    ??? HASH IS empno HASHKEYS 10000;
    ?
    ?
    ??? 例2:
    ??? 按部門號(hào)碼進(jìn)行檢索行,其他條件類似。且每個(gè)部門平均10個(gè)職員,部門號(hào)碼按10遞增(0,10,20,30,...)
    ?
    ??? 此時(shí)應(yīng)將deptno作為簇鍵,又因?yàn)樵摿邪鶆蚍植颊麛?shù),所以可以不使用內(nèi)部散列函數(shù)。SIZE的初始值是55字節(jié)*10,因此每個(gè)數(shù)據(jù)塊被賦予3個(gè)散列鍵。如果預(yù)料到某些沖突,且希望數(shù)據(jù)檢索的性能最好,可稍微更改所估計(jì)的SIZE值,以預(yù)防需要溢出數(shù)據(jù)塊而帶來沖突,調(diào)整12%的SIZE到620字節(jié)
    ??? HASHKEYS可以被設(shè)置成唯一的部門號(hào)碼的個(gè)數(shù)(1000),Oracle自動(dòng)轉(zhuǎn)換為最接近的素?cái)?shù)(1009)。
    ?
    ??? CREATE CLUSTER emp_cluster (deptno NUMBER )
    ??? ...
    ??? SIZE 620
    ??? HASH IS deptno HASHKEYS 1000;
    ?
    4、估計(jì)散列簇所需的空間大小
    ?
    ??? 依據(jù)SIZE和HASHKEYS的設(shè)置值,Oracle保證最初分配的空間足夠存儲(chǔ)散列表。如果對(duì)INITIAL、NEXT、MINEXTENTS的設(shè)置值不能滿足簇的大小,則分配增加的盤區(qū)直到至少滿足 SIZE*HASHKEYS
    ?
    ??? 例如:假設(shè)數(shù)據(jù)塊大小為2K,每個(gè)數(shù)據(jù)塊可用數(shù)據(jù)空間大約為1900字節(jié),且CREATE CLUSTER語句中指定如下:
    ??? STORAGE (INITIAL 100K
    ??? NEXT 150K
    ??? MINEXTENTS 1
    ??? PCTINCREASE 0)
    ??? SIZE 1500
    ??? HASHKEYS 100
    ?
    ??? 則以上例子中每個(gè)數(shù)據(jù)塊僅可賦予一個(gè)散列鍵,因此散列簇所需的初始空間至少是100*2K,所以設(shè)置的存儲(chǔ)參數(shù)無法滿足需求。因此需要分配給該散列簇一個(gè)100K的出示盤曲和一個(gè)150K的第2盤區(qū)。
    ?
    ??? 如果HASH參數(shù)指定為:
    ??? SIZE 500 HASHKEYS 100
    ??? 則此時(shí)可以給每個(gè)數(shù)據(jù)塊賦予3個(gè)散列鍵,此時(shí)需要的初始化空間是34*2K,可以滿足需求。
    ?
    ?
    三、更改散列簇
    ?
    ??? ALTER CLUSTER emp_dept ...;
    ??? --與簇相同
    ?
    ?
    四、刪除散列簇
    ?
    ??? DROP CLUSTER emp_dept;
    ??? --與簇相同
    ?
    ?
    五、散列簇相關(guān)信息
    ?
    ??? DBA|ALL|USER_CLUSTERS:該視圖包含了散列簇
    ??? DBA|USER_CLU_COLUMNS:該視圖包含了散列簇
    ??? DBA|ALL|USER_CLUSTER_HASH_EXPRESSIONS:列出用于散列簇的散列函數(shù)
    ?




    -The End-

    posted on 2009-03-18 22:23 decode360-3 閱讀(435) 評(píng)論(0)  編輯  收藏 所屬分類: DBA
    主站蜘蛛池模板: 国产亚洲精AA在线观看SEE| aⅴ在线免费观看| 免费v片在线观看品善网| 亚洲熟妇无码AV| 99re热免费精品视频观看| 亚洲欧洲综合在线| 国产成人免费午夜在线观看| 亚洲精品不卡视频| 1024免费福利永久观看网站| 亚洲一卡二卡三卡| 成人免费视频一区| 亚洲国产精品久久| 日韩免费的视频在线观看香蕉| 国产亚洲A∨片在线观看| 日韩人妻一区二区三区免费| 18禁免费无码无遮挡不卡网站| 亚洲毛片基地日韩毛片基地| 97在线观免费视频观看| 亚洲av午夜国产精品无码中文字 | 俄罗斯极品美女毛片免费播放| 美女又黄又免费的视频| 国产亚洲成归v人片在线观看| 热99RE久久精品这里都是精品免费| av大片在线无码免费| 亚洲综合激情五月丁香六月| 永久免费bbbbbb视频| 亚洲精品视频在线观看免费| 人禽杂交18禁网站免费| 另类图片亚洲校园小说区| 亚洲中文字幕无码中文字在线| 永久看日本大片免费35分钟 | 亚洲国产美女精品久久| 精品熟女少妇aⅴ免费久久| 久久久久亚洲精品无码蜜桃| 午夜一级毛片免费视频| 热久久这里是精品6免费观看 | 亚洲hairy多毛pics大全| 国产精品亚洲二区在线观看 | 日本视频免费在线| 日韩视频在线观看免费| 亚洲国产精品成人AV在线 |