我是 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而感到困扰,除非它涉及到索引无法工作的问题。我尝试仅选择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
然而,当我运行一个查询,选择具有特定LAST_NAME的人时,LAST_NAME索引似乎被忽略了。
select * from TBL_PERSON where LAST_NAME = 'Stenstrom'
为什么不使用IDX_LAST_NAME?说实话,我在复合索引IDX_PERSON_NAME上也遇到了同样的问题。
SYS
或SYSTEM
模式中创建自己的对象,而是为您的对象创建一个新的模式。SYS
和SYSTEM
由Oracle保留,因此该功能偶尔会在此处表现出不同行为。ROWID
是Oracle中的保留字,指的是行的物理地址,而不是主键值。在新开发中很少需要使用NVARCHAR2
数据类型,请选择Unicode字符集,改用VARCHAR2
代替。 - Justin Cave