我搜索了很多次,但我没有得到相同的确切解释。
我正在开发一个复杂的数据库结构(在Oracle 10g中),除静态表外,我几乎没有一个主键。
现在我的问题是考虑复合主键ID(LXI, VCODE, IVID, GHID
)。由于它是主键,Oracle将提供默认索引。
我是否会为主键本身或其子列获得一个(系统生成的)单个索引?
这是因为我正在检索基于各列的数据(大约数百万条记录)。现在,如果系统也为各列生成索引。为什么我的查询运行速度比我为每个列明确定义索引时实际运行的速度要快得多。
请给出满意的答案
提前致谢
答案 0 :(得分:3)
主键是非NULL唯一键。在您的情况下,唯一索引按声明顺序有四列LXI, VCODE, IVID GHID
。
如果VCODE
上有条件但LXI
上没有,则大多数数据库都不会使用该索引。 Oracle有一种特殊类型的索引扫描称为“跳过扫描”,它允许这种情况。它在documentation中描述。
我希望索引跳过扫描比单个列上的索引范围扫描慢一点。但是,哪个更好也可能取决于where
子句的复杂性。例如,由VCODE
连接的IVID
,GHID
和AND
上的三个相等条件可能是跳过扫描的一个很好的示例。并且,这样的索引将涵盖WHERE
子句 - 效率很高 - 并且优于单列索引。
注意:Oracle 9i中引入了索引跳过扫描,因此它们在Oracle 10中可用。
答案 1 :(得分:0)
它不会为单个列生成索引。它将生成一个复合索引 首先它将在LXI上编入索引 然后下一列就像它将是一个树结构。 如果你搜索主键的第一列,它将使用索引来使用索引,你必须将它与第一列组合
ex : select where ...LXI=? will use index PK
select where LXI=? and VCODE=? alse use pk
but select where VCODE=? will not use it (without LXI)