我正在使用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?
答案 0 :(得分:0)
我需要跟踪那些文章内容的更改:因此sha1为我提供了一个完美的解决方案。
不是主键,不是。文章的每个版本将具有不同的主键,因此将不可能跟踪对任何给定文章的更改。
您似乎更希望使用(art_id, version_no)
的复合键来存储内容更改,也许有一个主表仅为article
的父表art_id
与文章相关的不可变属性(无论它们可能是什么)。