database - 复合主键索引

标签 database oracle oracle10g rdbms

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

我正在研究一种复杂的数据库结构(在 Oracle 10g 中),除了静态表之外,我几乎在单个列上没有主键。

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

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

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

请给一个满意的答复

提前致谢

最佳答案

主键是非 NULL 唯一键。在您的情况下,唯一索引有四列,按声明顺序排列:LXI、VCODE、IVID GHID

如果您对 VCODE 有条件,但对 LXI 没有条件,则大多数数据库不会使用索引。 Oracle 有一种特殊类型的索引扫描,称为“跳过扫描”,它允许这种情况。 documentation 中对此进行了描述。 .

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

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

关于database - 复合主键索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38066128/

相关文章:

mysql - 帮助我为独立应用程序选择 RDBMS。很少关注

php - 我们为什么要获取对象?

mysql - SQL View 查询不起作用

sql - SQL 请求中的标识符无效

oracle - 无法连接到 Oracle 11g 中的 ExtProc

java - Java 中的 SQL 全连接

oracle - 如何防止(或限制)Oracle Reports Builder 10g 崩溃

没有与数据库紧密耦合并使用存储过程的 PHP 框架?

mysql - 查询审计表以检索状态更改时间

sql - 是否有理由不在 Oracle 中使用 View ?