gpt4 book ai didi

sql - oracle查询没有使用索引

转载 作者:行者123 更新时间:2023-12-04 22:41:09 24 4
gpt4 key购买 nike

我是 Oracle 的新手,虽然我相当广泛地使用 SQL Server,但我没有必要深入研究数据库设计的细节……特别是索引。因此,我花了很多时间阅读关于索引的教程......无论是在概念上还是在 Oracle 特定方面。

为了将我的理解付诸实践,我建立了一个带有一些基本索引的非常简单的表。

CREATE TABLE "SYSTEM"."TBL_PERSON" 
(
"PERSON_ID" NUMBER(10,0) NOT NULL ENABLE,
"FIRST_NAME" NVARCHAR2(120) NOT NULL ENABLE,
"MIDDLE_NAME" NVARCHAR2(120),
"LAST_NAME" NVARCHAR2(120) NOT NULL ENABLE,
"DOB" DATE NOT NULL ENABLE,
"IS_MALE" NCHAR(1) DEFAULT 'T' NOT NULL ENABLE,
CONSTRAINT "TBL_PERSON_PK" PRIMARY KEY ("PERSON_ID")
)

如您所见,PERSON_ID 字段包含表中每条记录的唯一 ROWID,并且是一个自动递增的主键。

(请不要因为丢失的 SQL 而挂断,除非它与 INDEXES 不工作的问题有关。我试图只从 DDL 中选择相关的 SQL,并且可能遗漏了一些项目。那里有很多东西我认为与此问题无关,所以我尝试将其删除)

我在表上创建了几个额外的非聚集索引。

CREATE INDEX "SYSTEM"."IDX_LAST_NAME" ON "SYSTEM"."TBL_PERSON" ("LAST_NAME") 
CREATE INDEX "SYSTEM"."IDX_PERSON_NAME" ON "SYSTEM"."TBL_PERSON" ("FIRST_NAME", "LAST_NAME")

当我在以下 SQL 上运行“解释计划”时,我收到通知说 PK 索引已按预期使用。

select * from TBL_PERSON where PERSON_ID = 21

enter image description here

但是,当我运行查询以选择具有特定 LAST_NAME 的人时,LAST_NAME 索引似乎被忽略了。

select * from TBL_PERSON where LAST_NAME = 'Stenstrom'

enter image description here

为什么不使用 IDX_LAST_NAME?对于它的值(value),我对复合索引 IDX_PERSON_NAME 也有同样的问题。

最佳答案

您的问题的关键是“基数”列。您估计只有五行返回表。

Oracle 有两种执行计划可供选择:

  1. 加载数据页。扫描数据页上的5条记录,选择符合条件的一条。
  2. 加载索引并扫描它以查找匹配项。然后加载数据页面并查找匹配的记录。

Oracle 得出结论,对于五个记录,第一种方法更快。如果您将更多数据加载到表中,您应该会看到执行计划发生变化。或者,如果您使用 select last_name 而不是 select *,那么 Oracle 很可能会选择索引。

关于sql - oracle查询没有使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23094904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com