我用谷歌搜索了很多次,但没有得到确切的解释。
我正在研究一种复杂的数据库结构(在 Oracle 10g 中),除了静态表之外,我几乎在单个列上没有主键。
现在我的问题是考虑复合主键 ID(LXI、VCODE、IVID、GHID
)。由于它是主键,Oracle 将提供默认索引。
我会为主键本身或其子列获得一个(系统生成的)单一索引吗?
问这个问题是因为我也在根据各个列检索数据(大约数百万条记录)。现在,如果系统也生成各个列的索引。当我为每个单独列显式定义索引时,为什么我的查询运行速度比实际运行速度快得多。
请给一个满意的答复
提前致谢
最佳答案
主键是非 NULL 唯一键。在您的情况下,唯一索引有四列,按声明顺序排列:LXI、VCODE、IVID GHID
。
如果您对 VCODE
有条件,但对 LXI
没有条件,则大多数数据库不会使用索引。 Oracle 有一种特殊类型的索引扫描,称为“跳过扫描”,它允许这种情况。 documentation 中对此进行了描述。 .
我预计索引跳过扫描比单个列上的索引范围扫描要慢一些。但是,哪个更好可能还取决于 where
子句的复杂性。例如,通过 AND
连接的 VCODE
、IVID
和 GHID
上的三个相等条件可能是一个很好的例子跳过扫描。而且,这样的索引将覆盖 WHERE
子句——效率很高——并且比单列索引更好。
请注意:索引跳过扫描是在 Oracle 9i 中引入的,因此它们在 Oracle 10 中可用。
关于database - 复合主键索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38066128/