首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle -行上的两个不相关的类别-如何索引?

oracle -行上的两个不相关的类别-如何索引?
EN

Stack Overflow用户
提问于 2012-12-10 07:22:38
回答 3查看 86关注 0票数 1

我有一个包含三个表的OLTP应用程序

代码语言:javascript
复制
Item Table - ItemId, CategoryId, AgeGroupId, ... 100K rows. 

CategoryTable - CategoryId, ...  (only 5-10 rows)
AgeGroupTable - AgeGroupId, ...  (only 4-5 rows) 

Item表的CategoryIdAgeGroupId的合适索引是什么?通过Category和/或Agegroup来查询条目会更好!

我在想,由于基数较低,位图索引可能会起作用,但我不知道它们如何在每个表中使用多个位图索引?水平分区有什么帮助,如果有的话?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-10 11:08:39

由于这是一个OLTP应用程序,您几乎肯定不想使用位图索引。位图索引往往不能很好地与OLTP应用程序配合使用。当您对数据执行大量单行操作时,它们的大小往往会非常迅速地增长(尽管这种影响在最近的版本中有所减弱)。但更重要的是,锁定的影响往往会从根本上降低应用程序的可伸缩性。例如,如果您在CategoryID上有一个位图索引,更新单行的CategoryID实际上需要锁定表中CategoryID为源值或目标值的每一行。

听起来,您最多需要(AgeGroupIDCategoryID)和(CategoryIDAgeGroupID)上的复合索引。如果只指定了CategoryID,则可能只在(AgeGroupIDCategoryID)上使用复合索引,而让Oracle使用索引跳过扫描。

您是否获得了使用分区的许可?这是企业版许可证之上的一个额外成本选项。我认为,您可能会对表进行分区。不过,考虑分区时,只有100,000行的表太小了。而且,无论您使用什么分区方式,都会使不使用分区键的查询效率降低。如果您知道指定AgeGroupID的查询比CategoryID更常见(反之亦然),这可能是有意义的,但这听起来并不像您所描述的那样。

票数 2
EN

Stack Overflow用户

发布于 2012-12-10 07:53:40

这篇文章一开始只是一个评论,但它太长了。

CategoryId和AgeGroupId的合适索引是什么?

在什么背景下?在您的示例架构中,这两个数据域都显示为主键和外键。然而,这不是重点。

您应该只在索引实际要增加价值的地方添加索引,并且每个表中的行数少于10行,除非数据非常不对称,否则索引这两个域都没有任何好处。插入/更新会更慢,并且通过这样的索引访问数据将比对3个表中的每个表执行全表扫描要慢。

item表中的其他属性之间可能存在隐含关系,因此将域添加到其他索引(但不是在前面)是有意义的,但由于不了解更多关于数据和对其运行的查询的信息,我暂时忽略这一点。

票数 2
EN

Stack Overflow用户

发布于 2012-12-10 10:17:11

这真的取决于你的查询是什么样子的。如果您总是只过滤或联接一列,那么位图索引将工作得很好。如果您将基于两个列进行筛选或联接,则复合索引也可以工作。

根据我的经验,确定的最好方法是测试这两个选项。我已经成功地在一个表上放置了多个位图索引,以及使用复合索引。在一个表中只有100K行的情况下,您应该能够非常快速地创建和删除索引。然后,您可以使用不同的索引集测试最常见的查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13792940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档