使用左连接[重复]时无法启用复合索引

问题描述 投票:0回答:1
我的目标是在学生表上使用复合索引。学生表将内部连接到注册表上。我在学生表上创建了索引,如下所示:

CREATE INDEX email_phonenumber_student_idx ON student(phonenumber, email);

当我运行查询时

SELECT Phonenumber, email from student left join enrolment on enrolment.studentnumber = student.studentnumber where months_between(SYSDATE, dateofbirth)/12 >= 18 and enrolment.studentnumber is null and student.phonenumber = '07123456788' and student.email = '[email protected]’;

它按预期工作,但是当我对查询进行“ EXPLAIN PLAN FOR”查询时,并没有使用索引,我只能看到主键作为索引。我是否在错误的表上创建了索引?出现的问题是我想使用复合键,但是,联接表不包含任何用于复合索引的列。

PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Plan hash value: 1388008413 --------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 63 | 0 (0)| 00:00:01 | | 1 | NESTED LOOPS ANTI | | 1 | 63 | 0 (0)| 00:00:01 | |* 2 | TABLE ACCESS BY INDEX ROWID| STUDENT | 1 | 50 | 0 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN | SYS_C0022463 | 1 | | 0 (0)| 00:00:01 | |* 4 | INDEX RANGE SCAN | SYS_C0022468 | 1 | 13 | 0 (0)| 00:00:01 | --------------------------------------------------------------------------------------------- PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("STUDENT"."EMAIL"='[email protected]' AND MONTHS_BETWEEN(SYSDATE@!,INTERNAL_FUNCTION("STUDENT"."DATEOFBIRTH"))/12>=18) 3 - access("STUDENT"."PHONENUMBER"='07123456788') 4 - access("ENROLMENT"."STUDENTNUMBER"="STUDENT"."STUDENTNUMBER")

sql database oracle syntax sqlplus
1个回答
1
投票
explain显示给定当前数据的“形状”(大小,分布等),优化器实际上将执行的操作。

数据库最昂贵的操作是磁盘I / O。由于只有17行,因此可以通过单个I / O操作(通常为2K页)将整个表读入内存,因此,将整个表读入内存并扫描内存中的所有行比通过一个索引,它将需要多个I / O操作。

您可能会发现索引可能开始在1000行中使用,但这取决于您的架构。

© www.soinside.com 2019 - 2024. All rights reserved.