复合主键的索引

Indices on composite primary key

我在谷歌上搜索了很多次,但没有得到确切的解释。

我正在处理一个复杂的数据库结构(在 Oracle 10g 中),其中除了静态表外,我几乎没有一个列的主键。

现在我的问题是考虑复合主键 ID (LXI, VCODE, IVID, GHID)。由于是主键,Oracle会提供默认索引。

我会为主键本身或其子列获得一个(系统生成的)单一索引吗?

之所以问这个问题,是因为我也在根据各个列检索数据(大约数百万条记录)。现在,如果系统也为各个列生成索引。当我为每个单独的列显式定义索引时,为什么我的查询运行速度比实际运行速度快得多。

请您给出满意的答复

提前致谢

它不会为单个列生成索引。它将生成一个复合索引 首先它将在 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)

主键是一个非空的唯一键。在您的例子中,唯一索引有四列,LXI, VCODE, IVID GHID 按照声明的顺序。

如果您在 VCODE 上有条件但在 LXI 上没有条件,那么大多数数据库都不会使用该索引。 Oracle 有一种特殊类型的索引扫描,称为 "skip scan",它允许这种情况。它在 documentation.

中描述

我希望索引跳过扫描比对单个列的索引范围扫描慢一点。但是,哪个更好可能还取决于 where 子句的复杂性。例如,由 AND 连接的 VCODEIVIDGHID 上的三个相等条件可能是跳过扫描的一个很好的例子。而且,这样的索引将覆盖 WHERE 子句——效率很高——并且比单列索引更好。

注意:索引跳过扫描是在 Oracle 9i 中引入的,因此它们在 Oracle 10 中可用。