我们目前有一个名为tAttributes的Oracle表定义为:
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是文档的唯一标识符。对于不同的文档,tAttributes表可以包含相同的attribute_id值,反之亦然。我们的tAttributes表的大小非常大,有大约6000万行。
给定一组document_id,我需要将每个attribute_id的distinct attribute_val写入查找表,tAttributesLookup,定义为:
create table tAttributesLookup
{
attribute_id integer not null,
attribute_val varchar(4000 byte) not null
}
我首先尝试通过针对不同attribute_id的tAttributes执行“select distinct(attribute_val)etc ...”来填充tAttributesLookup,但性能大约为几小时。
我现在认为应该动态填充tAttributesLookup - 当一行插入到tAttributes中时,如果attribute_id,attribute_val对存在且未插入,则首先检查tAttributesLookup。这有意义吗?我们有多个应用程序向tAttributes插入行,所以如果他们试图将相同的属性值写入tAttributesLookup,如何确保应用程序不会死锁?
提前致谢。
更新1
我认为这是一个重点:理想情况下,tAttributesLookup应该只包含具有特定状态的文档的属性。为了实现这一点,我希望用完整的不同属性值填充tAttributesLookup,然后使用Oracle分区函数根据属性值是否属于特定状态的文档来对tAttributesLookup进行分区。
更新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 :(得分:0)
从您看来,您正在尝试为tAttributes实现搜索功能。 你不需要一个单独的表,基本上应该只是tAttributes(attribute_val)的索引。如果您还需要过滤文档状态,请将其添加到tAttributes并按其分区,或将其包含在与attribute_val相同的索引中。