2009-05-29 64 views
1

我在甲骨文10的表結構如下優化SELECT查詢在Oracle 10密集唯一索引

Create Table Bookmarks( 
    BOOKMARKID NUMBER(10,0) NOT NULL PRIMARY KEY, 
    URL VARCHAR2(4000 CHAR) NOT NULL UNIQUE 
) 

網址具有唯一約束所設定的唯一指標。這張表中有大約100萬條記錄。我必須經常檢查表中是否存在書籤。我發出以下查詢

Select bookmarkid from Bookmarks where URL='<some url>' 

問題是,隨着記錄數量的增加,性能下降。現在,當查詢URL很長時,特別需要返回書籤ID的時間明顯更長。在解釋計劃中,查詢在URL列上使用唯一索引。任何提高響應時間的建議?

回答

3

您通常會爲此使用散列索引。在mssql中,我會創建一個像CRC(url)一樣的持久計算列。然後當你想檢查是否存在,你查找WHERE crc('some url')= PersistedCrcColumn AND URL ='some url'

你必須包含原始支票與crc支票,因爲你偶爾可以得到CRC碰撞。

編輯 - 將我上面的描述從'hash lookup'改爲'hash index'以避免混淆。有些dbs有散列索引作爲第一類索引,我不相信oracle(我知道mssql沒有)。如果它本質上不受支持,則上述方法是您如何手動實施它。

2

Calcuate MD4指數爲您URL,並在觸發其分配:

:new.HASH := DBMS_CRYPTO.hash(UTL_RAW.cast_to_raw(:new.url), 1) 

在該列上創建索引,並通過散列值進行搜索。

DBMS_CRYPTO不要忘了GRANT EXECUTE給擁有觸發器的用戶。

MD4是最快的散列算法,這就是爲什麼它在密碼強度並不重要的地方廣泛使用。

+0

是否需要觸發器?爲什麼不是基於函數的索引? – tuinstoel 2009-05-29 13:23:42

+0

@tuinstoel:UTL_RAW.cast_to_raw不確定。 – Quassnoi 2009-05-29 13:32:41

3

製作包含bookmarkid列的索引。 像這樣:

create IX on bookmarks (url, bookmarkid); 
2

檢查執行計劃使用的索引,而不是一個完整/快速全/範圍掃描一個獨特的掃描。 你可能有很多URL從http://www開始。 (也許還有更多的主要價值),這並不理想。如果可以,請在ORA_HASH(url)上創建一個非唯一基於函數的索引,並將其添加到查詢中。它會給出一個更小的索引值,價值分佈更好。 如果不能更改查詢,請嘗試使用REVERSE重新創建索引。

它不會幫助索引值的大小,但可能會更好地傳播它。