国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

Oracle 10g中利用哈希函數提高查詢速度

2024-08-29 13:33:46
字體:
來源:轉載
供稿:網友
當數據存儲在一個普通表中的時候,這些記錄將以插入到數據庫時的順序物理地保存到分配的塊中。例如,假如有一個用于存儲員工信息的表,那么員工姓名將會按照插入到表的順序存儲在表中。 假如員工記錄非常多的話,那么數據表的響應速度就會逐漸變慢。你可以通過選擇值相對等分布的一列(如員工的部門編號)并建立一個簇表來提高查詢員工的速度。 在簇表中,假如員工屬于同一個部門,那么它們的記錄將物理地存儲在同一系列的塊中。這樣就可以提高查找員工信息的速度,這是因為在檢索某個特定部門的員工時,需要讀取數據庫塊的數量減少了。而在非簇表中查找員工,就可能需要對每個數據庫塊進行訪問。 當表中存在大量鍵值的時候,你就會開始發現由于存在許多簇塊而導致的性能問題。避免這個問題的一個方法就是使用一個哈希函數來約束簇塊的數量。哈希函數將會給定一個數值用來限定簇塊數量的預計范圍,但它得到的值是相對等分布的。例如你可以創建一個哈希函數,只比較部門編號的最后兩位。 哈希函數中存在的一個問題就是函數值會打亂記錄原本的順序。你可以通過ORDER BY來解決這個問題;但是,在很多情況下,記錄數量是非常龐大的。在Oracle 10g 中,你可以將一個數據定義為“natural order” ,那么就可以不用經過排序而以你所希望的順序來檢索哈希簇的數據,從而解決了上面的提出問題。 例如,假設你有一個信用卡業務的數據庫。你決定以信用卡號作為簇主鍵將有利于數據的存儲分布。但是,由于存在大量的信用卡號,所以可以使用一個哈希函數來約束簇塊的數量。而且你希望在你的大部分報表中數據是按照時間順序排列的,那么在進行每個查詢操作時使用排序哈希簇,而不要使用ORDER BY。下面給出了相關語句:create cluster credit_cluster

(

card_no varchar2(16),

transdate date sort

)

hashkeys 10000 hash is ora_hash(card_no)

size 256;

create table credit_orders

(

card_no varchar2(16),

transdate date,

amount number

)

cluster credit_cluster(card_no,transdate);

alter session set nls_date_format = "YYYYMMDDHH24MISS";

insert into credit_orders (card_no,transdate,amount)

values ('4111111111111111','20050131000123',57.99);

insert into credit_orders (card_no,transdate,amount)

values ('4111111111111111','20050130071216',16.59);

insert into credit_orders (card_no,transdate,amount)

values ('4111111111111111','20050131111111',39.00);

insert into credit_orders (card_no,transdate,amount)

values ('4111111111111111','20050130081001',25.16);

可以看到我在這里使用了一個新函數ORA_HASH 來為信用卡建立一個哈希數值。現在,你可以非常簡單地對某個信用卡數據進行查詢,并返回自動排序后的結果。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盱眙县| 东乌珠穆沁旗| 霍林郭勒市| 监利县| 宁城县| 静海县| 密云县| 上思县| 太康县| 手机| 安乡县| 吉木萨尔县| 会昌县| 昆明市| 宝坻区| 贵阳市| 九江县| 宣城市| 惠东县| 郸城县| 富锦市| 夏津县| 孟村| 隆子县| 义马市| 锦州市| 潼关县| 靖安县| 甘孜| 平邑县| 克拉玛依市| 卓资县| 池州市| 洛阳市| 永川市| 沁源县| 冕宁县| 浙江省| 佛坪县| 新巴尔虎左旗| 镇赉县|