1. 程式人生 > >Oracle 10g中利用雜湊函式提高查詢速度

Oracle 10g中利用雜湊函式提高查詢速度

原文地址: 

當資料儲存在一個普通表中的時候,這些記錄將以插入到資料庫時的順序物理地儲存到分配的塊中。例如,如果有一個用於儲存員工資訊的表,那麼員工姓名將會按照插入到表的順序儲存在表中。

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

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

當表中存在大量鍵值的時候,你就會開始發現由於存在許多簇塊而導致的效能問題。避免這個問題的一個方法就是使用一個雜湊函式來約束簇塊的數量。雜湊函式將會給定一個數值用來限定簇塊數量的預計範圍,但它得到的值是相對等分佈的。例如你可以建立一個雜湊函式,只比較部門編號的最後兩位。

雜湊函式中存在的一個問題就是函式值會打亂記錄原本的順序。你可以通過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 來為信用卡建立一個雜湊數值。現在,你可以非常簡單地對某個信用卡資料進行查詢,並返回自動排序後的結果。

當資料儲存在一個普通表中的時候,這些記錄將以插入到資料庫時的順序物理地儲存到分配的塊中。例如,如果有一個用於儲存員工資訊的表,那麼員工姓名將會按照插入到表的順序儲存在表中。

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

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

當表中存在大量鍵值的時候,你就會開始發現由於存在許多簇塊而導致的效能問題。避免這個問題的一個方法就是使用一個雜湊函式來約束簇塊的數量。雜湊函式將會給定一個數值用來限定簇塊數量的預計範圍,但它得到的值是相對等分佈的。例如你可以建立一個雜湊函式,只比較部門編號的最後兩位。

雜湊函式中存在的一個問題就是函式值會打亂記錄原本的順序。你可以通過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 來為信用卡建立一個雜湊數值。現在,你可以非常簡單地對某個信用卡資料進行查詢,並返回自動排序後的結果。

當資料儲存在一個普通表中的時候,這些記錄將以插入到資料庫時的順序物理地儲存到分配的塊中。例如,如果有一個用於儲存員工資訊的表,那麼員工姓名將會按照插入到表的順序儲存在表中。

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

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

當表中存在大量鍵值的時候,你就會開始發現由於存在許多簇塊而導致的效能問題。避免這個問題的一個方法就是使用一個雜湊函式來約束簇塊的數量。雜湊函式將會給定一個數值用來限定簇塊數量的預計範圍,但它得到的值是相對等分佈的。例如你可以建立一個雜湊函式,只比較部門編號的最後兩位。

雜湊函式中存在的一個問題就是函式值會打亂記錄原本的順序。你可以通過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 來為信用卡建立一個雜湊數值。現在,你可以非常簡單地對某個信用卡資料進行查詢,並返回自動排序後的結果。

相關推薦

Oracle 10g利用函式提高查詢速度

原文地址:  當資料儲存在一個普通表中的時候,這些記錄將以插入到資料庫時的順序物理地儲存到分配的塊中。例如,如果有一個用於儲存員工資訊的表,那麼員工姓名將會按照插入到表的順序儲存在表中。 如果員工記錄非常多的話,那麼資料表的響應速度就會逐漸變慢。你可以通過選擇值相對等分

函式求模運算為什麼要使用素數,原因分析

一、雜湊函式 雜湊函式即是將元素對映到對應槽位置的方法。 一個好的雜湊函式應該是儘可能的將元素均勻的雜湊到 m 個槽位中的一個。 二、除法雜湊法 雜湊函式的實現有很多種,其中一種常見的雜湊函式即 除法雜湊法,h(k) = k mod m,通過取 k 除以 m 的餘數,將關鍵字 k 對映到 m 個

C++對hash_map自定義函式和比較函式的理解

#include "stdafx.h" #include <iostream> #include <hash_map> #include <vector>using std::vector; using stdext::hash_map;class  hash_wchar_

函式、Map-Reduce與Hadoop

雜湊函式 雜湊函式又叫雜湊函式,雜湊函式的輸入域可以是非常大的範圍,比如任意字串,但是輸出域是固定範圍,假設為s。 雜湊函式的性質: 典型的雜湊函式都擁有無限的輸入值域。 輸入值相同時,返回值相同,通常將返回值稱為雜湊值。 輸入值不同時,返回值可能相同,也可能

平方探測法處理函式衝突

  平方探測法是一種較好的處理衝突的方法,可以避免出現“堆積”問題,它的缺點是不能探測到散列表上的所有單元,但至少能探測到一半單元。下面通過一個例子來理解:   設Hash函式為 H( key ) = key mod 7,雜湊表的地址空間為0,1,...,10,開始時雜湊表為空,用平方探測法解決衝突,畫出依

演算法導論 第十一章:散列表 筆記(直接定址表、散列表、通過連結法解決碰撞、函式、開放定址法、完全

前面討論的各種資料結構中,記錄在各種結構中的相對位置是隨機的,和在記錄的關鍵字之間不存在有確定的關係,因此在查詢記錄是需要進行一系列和關鍵字的比較。而理想的情況是不希望進行任何的比較,一次存取便能得到所查記錄。那就必須在記錄的儲存位置和它的關鍵字之間建立一種確定的關係f,使每個關鍵字和結構中有一

java演算法和hashcode深入講解

java中的雜湊演算法和hashcode深入講解 一,雜湊演算法的概念     在計算機領域,雜湊演算法具有非常廣泛的應用,比如快速查詢和加密。今天我們來討論一下雜湊演算法。我們先從理論知識開始。 1,什麼是雜湊演算法  &

函式函式,Hash Function)

說明          雜湊的概念屬於查詢,它不以關鍵字的比較為基本操作,採用直接定址技術。在理想情況下,查詢的期望時間為O(1)。 簡單的說,hash函式就是把任意長的輸入字串變化成固定長的輸出字串的一種函式。輸出

djb2:一個產生簡單的隨機分佈的函式

目錄 LCG演算法 示例程式碼 djb2 示例程式碼 為什麼選擇引數33和 33 was chosen because: 5381 was chosen because 雜湊選擇參考 LCG

《資料結構與演算法之美》專欄閱讀筆記5——散列表和函式

這應該是看完最呆(沒有想到的那種呆~)的一個小章節了,給作者鼓掌,講的好好。果然抽象能力才是王道 文章目錄 1、散列表 1.1、小概念 1.2、雜湊函式 1

函式和陣列簽名概念

一、雜湊函式   也稱為雜湊函式,訊息摘要函式,單向函式或雜湊函式。 1. 作用:   不是完成資料加密和解密的工作,而是用來驗證資料的完整性的技術。  如下圖,通過對訊息進行雜湊,然後把訊息和雜湊值hashA一起傳送出去,當接受者收到訊息和雜湊值後,先對訊息進行雜湊,如果雜湊值

MD5加密(單向的函式)

作用:將資料庫的明文密碼加密為其他格式,更加保證安全性 已知: 一張表 user 存 id,username,password。 表中已有一條資料:1,tom,123 1)首先我們先來看一個mysql加密語句: 現在將 密碼 ‘123’ 加密 : update

PAT B1021個位數統計--利用

1021 個位數統計 (15 分) 輸入格式: 每個輸入包含 1 個測試用例,即一個不超過 1000 位的正整數 N。 輸出格式: 對 N 中每一種不同的個位數字,以 D:M 的格式在一行中輸出該位數字 D 及其在 N 中出現的次數 M。要求按 D 的升序輸出。 輸入樣例: 10

Go語言實現單向函式 —— MD5訊息摘要演算法、SHA256與224(Go語言實現)

 MD5訊息摘要演算法 MD5訊息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出一個128位(16位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。 Go語言實現方式一: packag

php的函式

php的雜湊函式 雜湊函式: echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n"; 驗證函式: boolean password_verify ( string&nbs

布隆過濾器 一致 函式

雜湊函式 :又名雜湊函式。       布隆過濾器:1經典結構 要求的失誤率 2  原理:每個url經過K個雜湊函式在對應相應位置描黑,所有url描黑後,整個布隆過濾器相應型別的陣列相當位置描黑,之後計算K個雜湊函式對應位置,如果K個雜湊函

函式的構造方法

一個“好”的雜湊函式一般應考慮下列兩個因素: 計算簡單,以便提高轉換速度; 關鍵詞對應的地址空間分佈均勻,以儘量減少衝突。 1 數字關鍵詞的雜湊函式構造 1.1 直接定址法 取關鍵詞的某個線性函式值為雜湊地址,即 h(key) = a × key + b

單向函式的性質

一 根據任意長度計算出固定長度的雜湊值 首先,單向雜湊函式的輸入必須能夠是任意長度的訊息。其次,無論輸入多長的訊息,單向雜湊函式必須都能夠生成長度很短的雜湊值,如果訊息越長生成的雜湊值越長的話就不好用了。從使用方便的角度,雜湊值的長度最好是短且固定的。 二 能夠快速計算出

單向函式的實際應用

一 單向雜湊函式相關術語 單向雜湊函式也稱為訊息摘要函式、雜湊函式或者雜湊函式。 輸入單向雜湊函式的訊息也稱為原像。 單向雜湊函式輸出的雜湊值也稱為訊息摘要或者指紋。 完整性也稱為一致性。 二 單向雜湊函式實際應用 1 檢測軟體是否被篡改 可以使用單向雜湊函式來

Redis叢集

關係:cluster>node>slot>key Redis 叢集中內建了 2^14=16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果