【问题标题】:Indices on composite primary key复合主键上的索引
【发布时间】:2016-06-28 02:30:29
【问题描述】:

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

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

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

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

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

请给个满意的答复

提前致谢

【问题讨论】:

  • 我觉得这个问题的答案自己不难验证吧?只需检查创建了哪些索引...
  • 这是个好问题。如果它显示使用两种不同索引结构的查询的性能数据会更好。

标签: database oracle oracle10g rdbms


【解决方案1】:

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

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

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

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

【讨论】:

  • 太棒了..!感谢您的解释和文档。 :)
【解决方案2】:

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

【讨论】:

  • 基本正确,但 Oracle 也能够为您的最后一个用例执行跳过索引扫描。
  • @sstan 同意了,但是。 “索引跳过扫描使用复合索引的逻辑子索引。数据库“跳过”单个索引,就好像它正在搜索单独的索引一样。如果复合索引的前导列中的不同值很少,而很多不同的值,则跳过扫描是有益的索引的非前导键中的不同值。"
  • @sstan 如果 LXI 有大量不同的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多