目前,我們已經定義了一個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;
您是否考慮過創建'tAttributesLookup'作爲[物化視圖](http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6002.htm)? –
我不希望物化視圖具有相同的性能問題,我現在通過在創建語句中使用「select distinct」短語? – user481779
我敢打賭,可以克服這些性能問題。是否可以將完整查詢添加到問題? –