oracle 索引表的好方法

1mrurvl1  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(123)

我有一个包含四列的表:ID、ID_version、名称、地址。一个ID可以有多个ID_version。当前示例有3个ID值,其中一个有两个ID_version。总共有四种组合:1- 1 1-2 2- 1 3-1所有组合具有大致相同的行数。
我的问题是:

select address from table where ID=1 and ID_version=1;

我想应用索引策略来改善上述查询的解释计划和一致性从autotrace获取。
首先,我将组织索引应用于该表中包含订单ID、ID_version、名称和地址的所有列。解释计划表明,使用这些主键可以快速扫描该表。基数是非常高的。
然后我改变了索引的顺序:ID_version、ID、名称、地址。解释计划显示这个表是使用这些主键进行范围扫描的,但是基数仍然很高。
然后,我将ID和ID_version合并到一列字符串中(现在表只有3列),并应用与第一次尝试相同的索引策略。现在,解释计划显示表是范围扫描的,与上述解决方案相比,一致获取的基数和值非常低。
有人能帮我解释一下这种行为吗?当ID和ID_version作为单独的列,但基数和一致获取的性能很好时,是否有其他索引策略?
先谢了。

hlswsv35

hlswsv351#

名为ID的列应该是表的唯一ID,即表中每个ID只有一行。名为ID_version的列应该是名为version的表的唯一ID。
这里的情况也不是这样,所以让我们重命名这两个列。你在处理历史化的联系信息。如果某人的姓名因结婚或离婚而更改,或者地址因搬家而更改,则会在表中创建新的联系人版本。

create table contact
(
  contact_number          number(10)          not null,
  contact_version_number  number(2)           not null,
  address                 varchar2(4000 char) not null,
  name                    varchar2(200 char)  not null,
  primary key (contact_number, contact_version_number)
);

表的主键是联系人号码(可以分配给一个人)和版本号(用于存储联系人的多个版本,以进行姓名和地址更改)的组合。通过将这两列(原始表中的ID和ID_version)作为主键,DBMS将创建一个具有相同顺序的相同列的唯一索引。因此,我们可以快速访问联系人(通过contact_number)及其版本(通过其contact_version_number)。如果我们只通过contact_version_number查询,索引将没有帮助,但这永远不会发生,因为contact_version_number 1,2或3或其他任何值只对给定的contact_number有意义。
在您的查询中,您通过contact_number和contact_version_number进行选择,索引将帮助您几乎立即找到那一行。如果您仅通过contact_number查询,索引仍然足以非常快地获得一个人的联系历史记录。
但是,由于表中只有五行,DBMS遍历索引是没有意义的。读整张表会更快。因此,当DBMS决定进行全表扫描时,不要感到惊讶。一旦表增长,索引将被使用,您将从中受益匪浅。

相关问题