2011-10-13 7 views
0

Nous avons actuellement une table Oracle nommée tAttributes définie comme:Oracle - Calcul des valeurs de recherche pour écran de recherche

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

attribute_id est l'identifiant unique de la catégorie de l'attribut, attribute_val est la valeur physique de l'attribut et document_id est un identifiant unique pour un document. Pour différents documents, la table tAttributes peut contenir la même valeur de attribute_id et vice versa. La taille de notre table tAttributes est assez importante avec environ 60 millions de lignes.

Étant donné un ensemble de années document_id je dois écrire les années distinctes de attribute_val par attribute_id à une table de consultation, tAttributesLookup, défini comme:

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

J'ai d'abord essayé de remplir tAttributesLookup en effectuant un « select (attribute_val) distincte etc ... "contre tAttributes pour attribut_id distinct, mais la performance était de l'ordre de quelques heures.

Je pense maintenant que tAttributesLookup doit être rempli dynamiquement - quand une ligne est insérée dans tAttributes, je vérifie d'abord tAttributesLookup si la paire attribute_id, attribute_val existe et si elle n'est pas insérée. Est-ce que ça a du sens? Nous avons plusieurs applications qui insèrent des lignes dans tAttributes. Comment puis-je m'assurer que les applications ne seront pas bloquées si elles tentent d'écrire la même valeur d'attributs dans tAttributesLookup?

Merci d'avance.

MISE À JOUR 1

Je pense que ce point est important: idéalement tAttributesLookup ne doit contenir que des attributs de documents qui ont un certain état. Pour ce faire, j'espérais remplir tAttributesLookup avec l'univers complet des valeurs d'attribut distinctes, puis utiliser la fonction de partition Oracle pour partitionner le tAttributesLookup selon que la valeur de l'attribut appartient à un ou plusieurs documents d'un état spécifique.

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

Avez-vous envisagé de créer 'tAttributesLookup' en tant que [vue matérialisée] (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6002.htm)? –

+0

Une vue matérialisée ne présenterait-elle pas le même problème de performances que la phrase "select distinct" dans l'instruction create? – user481779

+0

Je suis prête à parier que ces problèmes de performances pourraient être surmontés. question –

Répondre

0

De quoi il ressemble vous essayez de mettre en œuvre une fonctionnalité de recherche pour tAttributes. Vous n'avez pas besoin d'une table séparée pour ce qui devrait être simplement un index sur tAttributes (attribute_val). Si vous devez également filtrer l'état du document, ajoutez-le à tAttributes et partitionnez-le ou incluez-le dans le même index que attribute_val.

Questions connexes