复合主键的索引
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
连接的 VCODE
、IVID
和 GHID
上的三个相等条件可能是跳过扫描的一个很好的例子。而且,这样的索引将覆盖 WHERE
子句——效率很高——并且比单列索引更好。
注意:索引跳过扫描是在 Oracle 9i 中引入的,因此它们在 Oracle 10 中可用。
我在谷歌上搜索了很多次,但没有得到确切的解释。
我正在处理一个复杂的数据库结构(在 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
连接的 VCODE
、IVID
和 GHID
上的三个相等条件可能是跳过扫描的一个很好的例子。而且,这样的索引将覆盖 WHERE
子句——效率很高——并且比单列索引更好。
注意:索引跳过扫描是在 Oracle 9i 中引入的,因此它们在 Oracle 10 中可用。