熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

用排序哈希簇來提升ORACLE查詢速度

2013-11-13 22:12:17  來源: Oracle 

  當數據存儲在一個普通表中的時候這些記錄將以插入到數據庫時的順序物理地保存到分配的塊中例如如果有一個用於存儲員工信息的表那麼員工姓名將會按照插入到表的順序存儲在表中
  
  如果員工記錄非常多的話那麼數據表的響應速度就會逐漸變慢你可以通過選擇值相對等分布的一列(如員工的部門編號)並建立一個簇表來提高查詢員工的速度
  
  在簇表中如果員工屬於同一個部門那麼它們的記錄將物理地存儲在同一系列的塊中這樣就可以提高查找員工信息的速度這是因為在檢索某個特定部門的員工時需要讀取數據庫塊的數量減少了而在非簇表中查找員工就可能需要對每個數據庫塊進行訪問
  
  當表中存在大量鍵值的時候你就會開始發現由於存在許多簇塊而導致的性能問題避免這個問題的一個方法就是使用一個哈希函數來約束簇塊的數量哈希函數將會給定一個數值用來限定簇塊數量的預計范圍但它得到的值是相對等分布的例如你可以創建一個哈希函數只比較部門編號的最後兩位
  
  哈希函數中存在的一個問題就是函數值會打亂記錄原本的順序你可以通過 ORDER BY來解決這個問題但是在很多情況下記錄數量是非常龐大的在Oracle g 中你可以將一個數據定義為natural order 那麼就可以不用經過排序而以你所希望的順序來檢索哈希簇的數據從而解決了上面的提出問題
  
  例如假設你有一個信用卡業務的數據庫你決定以信用卡號作為簇主鍵將有利於數據的存儲分布但是由於存在大量的信用卡號所以可以使用一個哈希函數來約束簇塊的數量而且你希望在你的大部分報表中數據是按照時間順序排列的那麼在進行每個查詢操作時使用排序哈希簇而不要使用ORDER BY下面給出了相關語句
  
  create cluster credit_cluster
  (
  card_no varchar()
  transdate date sort
  )
  hashkeys hash is ora_hash(card_no)
  size ;
  
  
  create table credit_orders
  (
  card_no varchar()
  transdate date
  amount number
  )
  cluster credit_cluster(card_notransdate);
  
  
  alter session set nls_date_format = YYYYMMDDHHMISS;
  insert into credit_orders (card_notransdateamount)
  values ();
  insert into credit_orders (card_notransdateamount)
  values ();
  insert into credit_orders (card_notransdateamount)
  values ();
  insert into credit_orders (card_notransdateamount)
  values ();
  
  可以看到我在這裡使用了一個新函數ORA_HASH 來為信用卡建立一個哈希數值現在你可以非常簡單地對某個信用卡數據進行查詢並返回自動排序後的結果
From:http://tw.wingwit.com/Article/program/Oracle/201311/18457.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.