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

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

Oracle中利用哈希函數(shù)提高查詢速度

2024-08-29 13:31:43
字體:
供稿:網(wǎng)友

當數(shù)據(jù)存儲在一個普通表中的時候,這些記錄將以插入到數(shù)據(jù)庫時的順序物理地保存到分配的塊中。例如,如果有一個用于存儲員工信息的表,那么員工姓名將會按照插入到表的順序存儲在表中。

如果員工記錄非常多的話,那么數(shù)據(jù)表的響應速度就會逐漸變慢。你可以通過選擇值相對等分布的一列(如員工的部門編號)并建立一個簇表來提高查詢員工的速度。

在簇表中,如果員工屬于同一個部門,那么它們的記錄將物理地存儲在同一系列的塊中。這樣就可以提高查找員工信息的速度,這是因為在檢索某個特定部門的員工時,需要讀取數(shù)據(jù)庫塊的數(shù)量減少了。而在非簇表中查找員工,就可能需要對每個數(shù)據(jù)庫塊進行訪問。

當表中存在大量鍵值的時候,你就會開始發(fā)現(xiàn)由于存在許多簇塊而導致的性能問題。避免這個問題的一個方法就是使用一個哈希函數(shù)來約束簇塊的數(shù)量。哈希函數(shù)將會給定一個數(shù)值用來限定簇塊數(shù)量的預計范圍,但它得到的值是相對等分布的。例如你可以創(chuàng)建一個哈希函數(shù),只比較部門編號的最后兩位。

哈希函數(shù)中存在的一個問題就是函數(shù)值會打亂記錄原本的順序。你可以通過 order by來解決這個問題;但是,在很多情況下,記錄數(shù)量是非常龐大的。在oracle 10g 中,你可以將一個數(shù)據(jù)定義為“natural order” ,那么就可以不用經(jīng)過排序而以你所希望的順序來檢索哈希簇的數(shù)據(jù),從而解決了上面的提出問題。

例如,假設(shè)你有一個信用卡業(yè)務(wù)的數(shù)據(jù)庫。你決定以信用卡號作為簇主鍵將有利于數(shù)據(jù)的存儲分布。但是,由于存在大量的信用卡號,所以可以使用一個哈希函數(shù)來約束簇塊的數(shù)量。而且你希望在你的大部分報表中數(shù)據(jù)是按照時間順序排列的,那么在進行每個查詢操作時使用排序哈希簇,而不要使用order by。下面給出了相關(guān)語句:


  
  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);
 

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

注冊會員,創(chuàng)建你的web開發(fā)資料庫,
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 资源县| 华坪县| 理塘县| 隆安县| 和平区| 常山县| 射阳县| 曲水县| 北辰区| 淮北市| 沂南县| 睢宁县| 航空| 玛沁县| 南川市| 新宁县| 徐闻县| 襄樊市| 泰州市| 阿克陶县| 察隅县| 福清市| 康保县| 互助| 炎陵县| 通州市| 新乡市| 始兴县| 凤翔县| 宝兴县| 黄平县| 镇坪县| 鹤壁市| 青海省| 永定县| 香港 | 布尔津县| 三河市| 和平县| 长白| 义乌市|