資料庫表--hash clustered table
Hash clustered table與索引聚簇表非常相似,只有一個主要區別:聚簇鍵索引被一個hash函式所取代,表中的資料就是索引.所以沒有物理索引
hash clustered table也有副作用,如果不對錶加一個傳統索引,將無法對錶進行range scan,比如 select * from emp where deptno between 10 and 20,會產生全表掃描.
理想情況下,雜湊值均勻地分佈到為雜湊聚簇分配的所有塊上,從查詢利用一個I/O就能直接找到資料。實際中,最後可能會有多行資料的雜湊值雜湊到同一個資料庫塊地址,而且這個塊上放不下這麼多行,這就會導致塊串鏈,用一個連結串列把塊串起來,來儲存雜湊到這個塊的所有行,當需要獲取與某個雜湊鍵匹配的行時,可能必須訪問多個塊。此外,雜湊衝突也會增加開銷,使塊串聯的可能性增加。
相關引數:
HASHKEYS:Oracle將HASHKEYS值“舍入”為與之最接近的質數(雜湊鍵數總是一個質數),然後再將SIZE引數乘以修改後的HASHKEYS值,根據這個結果為聚簇分配空間。也就是至少需要分配的空間位元組數。可以用公式(HASHKEYS/trunc(blocksize/SIZE))來計算雜湊聚簇需要預留的最少塊數量。對一個幾乎為空的雜湊聚簇進行全表掃描與全面掃描一個滿的雜湊聚簇所花的時間是一樣的。所以,建立雜湊聚簇的目的是為了根據雜湊鍵查詢從而非常快地訪問資料,而不是為了頻繁地對它進行全面掃描。
HASH IS:此選項用來指定雜湊函式。可以指定一個SQL函式。如果不指定則使用Oracle內部的雜湊函式。
SINGLE TABLE:此選項用來指定建立單表雜湊聚簇(single table hash cluster),這是雜湊聚簇有一個特例。它只支援聚簇中存在一個表。這種雜湊聚簇是為按主鍵來快速訪問一個表而設計得。單表雜湊聚簇需要更少的緩衝區latch來完成處理,並CPU的用量會大幅減少
建立雜湊聚簇表步驟如下:
建立雜湊聚簇
create cluster emp_dep_cluster (depno number(2)) hashkeys 100 size 2048 hash is depno;
建立表
create table department (
depno number(2) primary key, depname varchar2(20))
cluster emp_dep_cluster(depno);
create table employee (
empno number primary key, empname varchar2(20),
depno number(2) references department(depno))
cluster emp_dep_cluster(depno);
hash clustered table的要點是:
1)hash clustered table中是把傳遞到查詢的需求轉換成一個FILE/BLOCK,並且直接讀,不經過索引.
2)hash clustered table的I/O要少得多,因為heap table要至少做一次I/O來獲取rowid,然後透過rowid來訪問表
3)雜湊聚簇查詢與索引查詢所用的CPU是一樣的,儘管它訪問buffer hash的次數要少得多。但執行hash是一個CPU相當密集的操作(索引是I/O密集的操作).這裡要做個權衡.
hash clustered table小結
1) 雜湊聚簇一開始就要分配空間。Oracle根據你的HASHKEYS和SIZE來計算HASHKEYS/trunc
(blocksize/SIZE),立即分配空間,並完成格式化,一旦將第一個表放入這個聚簇中,任何
全面掃描都會命中每一個已分配的塊。在這方面,它與其他的所有表都不同。
2) 雜湊聚簇中的HASHKEY 數是固定大小的。除非重新聚簇,否則不能改變雜湊表的大小。這
並不會限制聚簇中能儲存的資料量,它只是限制了能為這個聚簇生成的惟一雜湊鍵的個數。如
果HASHKEY 值設定得太低,可能因為無意的雜湊衝突影響效能。
3) 不能在聚簇鍵上完成區間掃描。諸如WHERE cluster_key BETWEEN 50 AND 60 謂詞條件
不能使用雜湊演算法。介於50~60 之間的可能值有無限多個,伺服器必須生成所有可能的值,並
分別計算雜湊,來檢視相應位置是否有資料。這是不可能的。如果你在一個聚簇鍵上使用區間
掃描,而且沒有使用傳統索引,實際上會全面掃描這個聚簇。
雜湊聚簇適用於以下情況:
· 很清楚表中會有多少行,或者知道一個合理的上界。HASHKEY和SIZE引數的大小要正確,這對於避免聚簇重建至關重要。
· 主要執行獲取操作相比,DML(特別是插入)很少。更新不會引入嚴重的開銷, 除非更新了HASHKEY(更新HASHKEY會導致行遷移)。
· 經常按HASHKEY值訪問資料。
hash clustered table也有副作用,如果不對錶加一個傳統索引,將無法對錶進行range scan,比如 select * from emp where deptno between 10 and 20,會產生全表掃描.
理想情況下,雜湊值均勻地分佈到為雜湊聚簇分配的所有塊上,從查詢利用一個I/O就能直接找到資料。實際中,最後可能會有多行資料的雜湊值雜湊到同一個資料庫塊地址,而且這個塊上放不下這麼多行,這就會導致塊串鏈,用一個連結串列把塊串起來,來儲存雜湊到這個塊的所有行,當需要獲取與某個雜湊鍵匹配的行時,可能必須訪問多個塊。此外,雜湊衝突也會增加開銷,使塊串聯的可能性增加。
相關引數:
HASHKEYS:Oracle將HASHKEYS值“舍入”為與之最接近的質數(雜湊鍵數總是一個質數),然後再將SIZE引數乘以修改後的HASHKEYS值,根據這個結果為聚簇分配空間。也就是至少需要分配的空間位元組數。可以用公式(HASHKEYS/trunc(blocksize/SIZE))來計算雜湊聚簇需要預留的最少塊數量。對一個幾乎為空的雜湊聚簇進行全表掃描與全面掃描一個滿的雜湊聚簇所花的時間是一樣的。所以,建立雜湊聚簇的目的是為了根據雜湊鍵查詢從而非常快地訪問資料,而不是為了頻繁地對它進行全面掃描。
HASH IS:此選項用來指定雜湊函式。可以指定一個SQL函式。如果不指定則使用Oracle內部的雜湊函式。
SINGLE TABLE:此選項用來指定建立單表雜湊聚簇(single table hash cluster),這是雜湊聚簇有一個特例。它只支援聚簇中存在一個表。這種雜湊聚簇是為按主鍵來快速訪問一個表而設計得。單表雜湊聚簇需要更少的緩衝區latch來完成處理,並CPU的用量會大幅減少
建立雜湊聚簇表步驟如下:
建立雜湊聚簇
create cluster emp_dep_cluster (depno number(2)) hashkeys 100 size 2048 hash is depno;
建立表
create table department (
depno number(2) primary key, depname varchar2(20))
cluster emp_dep_cluster(depno);
create table employee (
empno number primary key, empname varchar2(20),
depno number(2) references department(depno))
cluster emp_dep_cluster(depno);
hash clustered table的要點是:
1)hash clustered table中是把傳遞到查詢的需求轉換成一個FILE/BLOCK,並且直接讀,不經過索引.
2)hash clustered table的I/O要少得多,因為heap table要至少做一次I/O來獲取rowid,然後透過rowid來訪問表
3)雜湊聚簇查詢與索引查詢所用的CPU是一樣的,儘管它訪問buffer hash的次數要少得多。但執行hash是一個CPU相當密集的操作(索引是I/O密集的操作).這裡要做個權衡.
hash clustered table小結
1) 雜湊聚簇一開始就要分配空間。Oracle根據你的HASHKEYS和SIZE來計算HASHKEYS/trunc
(blocksize/SIZE),立即分配空間,並完成格式化,一旦將第一個表放入這個聚簇中,任何
全面掃描都會命中每一個已分配的塊。在這方面,它與其他的所有表都不同。
2) 雜湊聚簇中的HASHKEY 數是固定大小的。除非重新聚簇,否則不能改變雜湊表的大小。這
並不會限制聚簇中能儲存的資料量,它只是限制了能為這個聚簇生成的惟一雜湊鍵的個數。如
果HASHKEY 值設定得太低,可能因為無意的雜湊衝突影響效能。
3) 不能在聚簇鍵上完成區間掃描。諸如WHERE cluster_key BETWEEN 50 AND 60 謂詞條件
不能使用雜湊演算法。介於50~60 之間的可能值有無限多個,伺服器必須生成所有可能的值,並
分別計算雜湊,來檢視相應位置是否有資料。這是不可能的。如果你在一個聚簇鍵上使用區間
掃描,而且沒有使用傳統索引,實際上會全面掃描這個聚簇。
雜湊聚簇適用於以下情況:
· 很清楚表中會有多少行,或者知道一個合理的上界。HASHKEY和SIZE引數的大小要正確,這對於避免聚簇重建至關重要。
· 主要執行獲取操作相比,DML(特別是插入)很少。更新不會引入嚴重的開銷, 除非更新了HASHKEY(更新HASHKEY會導致行遷移)。
· 經常按HASHKEY值訪問資料。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29337971/viewspace-1062759/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫表--sorted hash clustered table資料庫
- 資料庫表--index clustered table資料庫Index
- 資料庫表--nested table資料庫
- 資料庫表--temporary table資料庫
- 資料庫表--object table資料庫Object
- 資料庫表--external table資料庫
- 資料庫表--heap organized table資料庫Zed
- 資料庫表--index organized table資料庫IndexZed
- 演算法與資料結構基礎 - 雜湊表(Hash Table)演算法資料結構
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法
- 什麼是Clustered Table,與其他型別的table有何不同型別
- Hash分割槽表及資料分佈
- 簇表及簇表管理(Index clustered tables)Index
- 【移動資料】External Table 外部表
- 資料庫實現原理#4(Hash Join)資料庫
- 資料庫的sort group by和hash group by資料庫
- Clustered Index Scan and Clustered Index SeekIndex
- [CareerCup] 8.10 Implement a Hash Table 實現一個雜湊表
- GaussDB資料庫SQL系列-LOCK TABLE資料庫SQL
- 資料庫 sqlite3_get_table,sqlite3_free_table資料庫SQLite
- 【資料庫資料恢復】Oracle資料庫誤truncate table的資料恢復案例資料庫資料恢復Oracle
- 【資料庫資料恢復】oracle資料庫誤truncate table怎麼恢復資料?資料庫資料恢復Oracle
- 【資料庫資料恢復】誤truncate table的Oracle資料庫資料恢復方案資料庫資料恢復Oracle
- 資料庫升級後‘PLAN_TABLE資料庫
- 資料結構,雜湊表hash設計實驗資料結構
- 建立資料庫表資料庫
- 資料庫分庫分表資料庫
- REORG TABLE命令最佳化資料庫效能資料庫
- javascript: 帶分組資料的Table表頭排序JavaScript排序
- 恢復被執行truncate table的表資料
- vxe-form table 表單使用資料校驗ORM
- add hash partition , default tablespace for patitioned table
- PostgreSQL:表空間-->資料庫-->表SQL資料庫
- Redis原理再學習04:資料結構-雜湊表hash表(dict字典)Redis資料結構
- 更改資料庫表名資料庫
- 資料庫表設計資料庫
- 資料庫 建立 3表資料庫
- mybatis進行資料庫建表 CREATE command denied to user 'root'@'127.0.0.1' for table 問題MyBatis資料庫127.0.0.1