如何在Oracle中索引SHA1值并将其用作PK?

时间:2018-08-07 13:03:31

标签: oracle indexing database-design data-modeling

我正在使用oracle 11g标准版: 为了识别我的表ART_ARTICLE中的某些商品,我正在根据商品的内容计算哈希(sha1),并将此哈希存储在ART_ID列中。  我需要跟踪那些文章内容的更改:因此sha1为我提供了一个完美的解决方案。  事实是,所有值都不是连续的,并且我有很大的聚类因子,当我不得不查询表时,大多数时候我需要同时导入一系列文章(因此,一个接一个地插入)在我索引的不同叶子中)...  这引起了一些性能问题(例如,当我尝试导出以前导入的文章列表时,查询很长)。  我存储了所有导入数据的版本,并具有一个修订系统(版本表可帮助我将每个导入存储在一个版本中。一个版本中的导入可能会使以前的导入版本超载...)

我的模型如下:

----------------------
TABLE : ART_ARTICLE
--------------------
ART_ID NUMBER(15) PK => computed as SHA1 from others properties (name,short_name..)
NAME
SHORT_NAME
ORIGIN
COLOR 

----------------------
TABLE : ART_ARTICLE_VERSION
--------------------
ART_VERSION PK(1)
ART_ID      PK(2) => PK composed by those 2 first fields
ART_EDIT_TYPE   (Enum in order to know if ART_ID was added/updated/remove from version ART_VERSION

我有一个问题:    随着越来越多的我导入新版本和文章列表,越来越多的我在查询某个版本的所有文章项时遇到性能问题。   当我按ART_ARTICLE_VERSION中的出现顺序对ART_ARTICLE的内容重新排序并在ART_ID上重建索引时,查询又很快了。   如果仅在导入后重新构建索引,则没有任何实际收获。因此,我认为以PK作为散列的事实会影响索引的使用。

在ART_ID列上创建索引的方式是否有任何建议?  每次导入后是否都需要重新创建表并以正确的顺序插入我的ART_ID?

1 个答案:

答案 0 :(得分:0)

  

我需要跟踪那些文章内容的更改:因此sha1为我提供了一个完美的解决方案。

不是主键,不是。文章的每个版本将具有不同的主键,因此将不可能跟踪对任何给定文章的更改。

您似乎更希望使用(art_id, version_no)的复合键来存储内容更改,也许有一个主表仅为article的父表art_id与文章相关的不可变属性(无论它们可能是什么)。