我有一个包含三个表的OLTP应用程序
Item Table - ItemId, CategoryId, AgeGroupId, ... 100K rows.
CategoryTable - CategoryId, ... (only 5-10 rows)
AgeGroupTable - AgeGroupId, ... (only 4-5 rows) Item表的CategoryId和AgeGroupId的合适索引是什么?通过Category和/或Agegroup来查询条目会更好!
我在想,由于基数较低,位图索引可能会起作用,但我不知道它们如何在每个表中使用多个位图索引?水平分区有什么帮助,如果有的话?
发布于 2012-12-10 11:08:39
由于这是一个OLTP应用程序,您几乎肯定不想使用位图索引。位图索引往往不能很好地与OLTP应用程序配合使用。当您对数据执行大量单行操作时,它们的大小往往会非常迅速地增长(尽管这种影响在最近的版本中有所减弱)。但更重要的是,锁定的影响往往会从根本上降低应用程序的可伸缩性。例如,如果您在CategoryID上有一个位图索引,更新单行的CategoryID实际上需要锁定表中CategoryID为源值或目标值的每一行。
听起来,您最多需要(AgeGroupID,CategoryID)和(CategoryID,AgeGroupID)上的复合索引。如果只指定了CategoryID,则可能只在(AgeGroupID,CategoryID)上使用复合索引,而让Oracle使用索引跳过扫描。
您是否获得了使用分区的许可?这是企业版许可证之上的一个额外成本选项。我认为,您可能会对表进行分区。不过,考虑分区时,只有100,000行的表太小了。而且,无论您使用什么分区方式,都会使不使用分区键的查询效率降低。如果您知道指定AgeGroupID的查询比CategoryID更常见(反之亦然),这可能是有意义的,但这听起来并不像您所描述的那样。
发布于 2012-12-10 07:53:40
这篇文章一开始只是一个评论,但它太长了。
CategoryId和AgeGroupId的合适索引是什么?
在什么背景下?在您的示例架构中,这两个数据域都显示为主键和外键。然而,这不是重点。
您应该只在索引实际要增加价值的地方添加索引,并且每个表中的行数少于10行,除非数据非常不对称,否则索引这两个域都没有任何好处。插入/更新会更慢,并且通过这样的索引访问数据将比对3个表中的每个表执行全表扫描要慢。
item表中的其他属性之间可能存在隐含关系,因此将域添加到其他索引(但不是在前面)是有意义的,但由于不了解更多关于数据和对其运行的查询的信息,我暂时忽略这一点。
发布于 2012-12-10 10:17:11
这真的取决于你的查询是什么样子的。如果您总是只过滤或联接一列,那么位图索引将工作得很好。如果您将基于两个列进行筛选或联接,则复合索引也可以工作。
根据我的经验,确定的最好方法是测试这两个选项。我已经成功地在一个表上放置了多个位图索引,以及使用复合索引。在一个表中只有100K行的情况下,您应该能够非常快速地创建和删除索引。然后,您可以使用不同的索引集测试最常见的查询。
https://stackoverflow.com/questions/13792940
复制相似问题