2011-10-13 34 views
0

目前,我們已經定義了一個Oracle表命名tAttributes爲:甲骨文 - 計算查找值搜索屏幕

create table tAttributes 
{ 
    attribute_id integer not null, 
    document_id integer not null, 
    attribute_val varchar(4000 byte) not null 
} 

Attribute_id是屬性的類別的唯一標識符,attribute_val是屬性和DOCUMENT_ID的物理值文檔的唯一標識符。對於不同的documentid,tAttributes表可以包含相同的attribute_id值,反之亦然。我們的tAttributes表的大小相當龐大,大約有6000萬行。

給定一組DOCUMENT_ID的我需要寫每attribute_id獨特attribute_val的查找表,tAttributesLookup,定義爲:

create table tAttributesLookup 
{ 
    attribute_id integer not null, 
    attribute_val varchar(4000 byte) not null 
} 

我第一次嘗試通過執行填充tAttributesLookup一個「選擇不同的(attribute_val)等等......「針對獨特的attribute_id的tAttributes,但是性能大約是幾個小時。

我現在認爲應該動態地填充tAttributesLookup - 當一行插入到tAttributes中時,如果attribute_id,attribute_val對存在並且不插入它們,我首先檢查tAttributesLookup。這有意義嗎?我們有多個應用程序向tAttributes插入行,所以如何確保應用程序在嘗試將相同屬性值寫入tAttributesLookup時不會死鎖?

在此先感謝。

更新1

我認爲這是一個重要的觀點:理想tAttributesLookup應只包含有某種狀態的文檔屬性。爲了達到這個目的,我希望用不同屬性值的整個宇宙填充tAttributesLookup,然後根據屬性值是否屬於特定狀態的文檔,使用Oracle分區函數對tAttributesLookup進行分區。

UPATE 2

insert into 
    tAttributesLookup (attribute_id, attribute_val) 
select 
    a.attribute_id, distinct(a.attribute_val) 
from 
    tAttributes a, 
    tDocuments d 
where 
    a.document_id = d.document_id 
    and 
    a.attribute_id = X; 
+0

您是否考慮過創建'tAttributesLookup'作爲[物化視圖](http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6002.htm)? –

+0

我不希望物化視圖具有相同的性能問題,我現在通過在創建語句中使用「select distinct」短語? – user481779

+0

我敢打賭,可以克服這些性能問題。是否可以將完整查詢添加到問題? –

回答

0

從它看起來像你正試圖實施tAttributes搜索功能。 對於基本上應該只是tAttributes(attribute_val)上的索引,您不需要單獨的表。如果您還需要過濾文檔狀態,請將其添加到tAttributes並按其分區,或者將其與attribute_val包含在相同的索引中。