我和一位同事是Oracle的新手,正在分析桌面上的索引。这是遗留物,表格中目前存在索引
Mytable
* ID (primary key)
* partId (Id column in part)
* partNum (partNum column in part...partNum can have more than one partId)
* description (description of partNum...can be different for each partNum)
* dateReceived
IDX_PART_ID_PART_NUM(partId, PartNum)
IDX_PART_NUM(partNum)
IDX_DATE_RECEIVED(dateReceived)
我们的索引似乎有冗余。我们应该从IDX_PART_ID_PART_NUM中删除partNum吗?我们应该删除IDX_PART_NUM吗?如上所述,partNum可以有多个id,因为每个部分在对象中可以存在多次。
基本上,在Oracle中,索引是如何工作的?
答案 0 :(得分:8)
如果您有查询同时查找partID
和partNum
,那么您希望维护索引。在索引中包含两个列意味着索引首先按partID
细分,然后再对每个partID
细分,按partNum
进行细分。仅在partNum
上设置其他索引对于仅在partNum
上查询而在partID
上查询的查询非常有用。
以下是一篇好文章的链接:http://it.toolbox.com/blogs/confessions/post-index-how-oracle-works-10605
作为一般规则,我会避免触及旧系统上的索引。如果它是一个已经生产了一段时间的旧系统,这些索引可能由DBA创建,他们做了一些分析并计划确保它们运行良好并适合数据的使用。
答案 1 :(得分:1)
另一种方法是对表运行一些示例查询,然后检查EXPLAIN PLAN结果。您应该看到已定义索引的使用模式。
就推荐而言,您所引用的索引似乎都可以独立使用。我会保留它们两者,除非你注意到在批量加载期间插件上有一些不良的性能损失或其他什么。
答案 2 :(得分:0)
索引的工作原理是允许数据库围绕一组列组织数据。我承认我对这方面的技术实现并不是100%肯定,但它使用这些值创建了一个数据结构,并将它们映射到表中每行的对象ID。 (如果我错了,有人纠正我,虽然它不应该影响我整个答案的价值)
您尝试在您经常搜索的任何内容上创建索引,以加快速度。通过在partNum
上建立索引,您可以很快找到partNum
之前的任何内容。但partId, partNum
上的索引允许在表格上进行非常快速的搜索,您必须匹配两列。
请考虑以下事项:
SELECT *
FROM MyTable
WHERE partId = 2
AND partNum = 7
这将使用IDX_PART_ID_PART_NUM
进行搜索,使用两个值来扫描索引,而不仅仅是IDX_PART_NUM
。这仍然比单独在两个列上都有索引时更快。
本质上,它允许将两列的值一起索引,因此对于每个列的每个值,它将知道另一个的允许值,并且不必为每个查询执行2次查找,当它可以做一个。
要回答这个问题,如果您经常查询这两列,请保留多部分索引。
答案 3 :(得分:0)
所有索引都是正确的,但性能取决于每个索引列上的记录数和查询频率。
如果您需要少于20%的行,则索引的查询速度很快。 查询40%行,全扫描速度最快。 索引需要磁盘,内存,插入/更新时间。
很多时候,索引在磁盘和内存上需要的空间比所有者表更多。
答案 4 :(得分:0)
基本上,在Oracle中,索引是如何工作的?
另一个全面的答案:http://Use-The-Index-Luke.com