Oracle - 计算搜索屏幕的查找值

时间:2011-10-13 20:42:24

标签: sql oracle

我们目前有一个名为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;  

1 个答案:

答案 0 :(得分:0)

从您看来,您正在尝试为tAttributes实现搜索功能。 你不需要一个单独的表,基本上应该只是tAttributes(attribute_val)的索引。如果您还需要过滤文档状态,请将其添加到tAttributes并按其分区,或将其包含在与attribute_val相同的索引中。