Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 复合主键上的索引_Database_Oracle_Oracle10g_Rdbms - Fatal编程技术网

Database 复合主键上的索引

Database 复合主键上的索引,database,oracle,oracle10g,rdbms,Database,Oracle,Oracle10g,Rdbms,我在谷歌上搜索了很多次,但没有得到确切的解释 我正在处理一个复杂的数据库结构(在Oracle10g中),除了静态表之外,我几乎没有一个主键在一个列上 现在我的问题是考虑一个合成的主键ID( LXI,VCODEL,IVID,GHID)。由于它是主键,Oracle将提供默认索引 我会为主键本身或其子列获得一个(系统生成的)单一索引吗 问这个问题是因为我也在基于单个列检索数据(大约数百万条记录)。现在,如果系统也为各个列生成索引。为什么我的查询运行速度比我为每个列显式定义索引时的实际运行速度快得多 请

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

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

现在我的问题是考虑一个合成的主键ID(<代码> LXI,VCODEL,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有一种特殊类型的索引扫描,称为“跳过扫描”,它允许这种情况。本节将对其进行描述

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


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

大多数情况下是正确的,但Oracle也可以为您的上一个用例执行跳过索引扫描。@sstan同意,但。索引跳过扫描使用复合索引的逻辑子索引。数据库在单个索引中“跳过”,就好像它在搜索单独的索引一样。如果复合索引的前导列中有几个不同的值,而索引的非前导键中有许多不同的值,则跳过扫描是有益的@如果LXI有大量不同的值,我想这个问题的答案不难自己验证,不是吗?只需检查创建了哪些索引……这是一个好问题。如果它使用两种不同的索引结构显示查询的性能数据,那就更好了。太好了。。!感谢您的解释和文档。:)