【发布时间】:2020-09-03 03:18:41
【问题描述】:
我的目标是在student 表上使用复合索引。 Student 表将内连接到xyz 表。我在学生表上创建了我的索引,如下所示:
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 = 'Chris@Lailasman.com’;
它按预期工作,但没有使用索引,因为当我'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"='Chris@Lailasman.com' AND
MONTHS_BETWEEN(SYSDATE@!,INTERNAL_FUNCTION("STUDENT"."DATEOFBIRTH"))/12>=18)
3 - access("STUDENT"."PHONENUMBER"='07123456788')
4 - access("ENROLMENT"."STUDENTNUMBER"="STUDENT"."STUDENTNUMBER")
【问题讨论】:
-
and xyz.studentnumber is null;在您的查询中,但您的解释计划没有显示过滤器,我在这里遗漏了什么吗? -
我用它来识别左表中不在右表中的行。
-
解释计划没有显示它,所以不确定它是否是同一个查询。无论如何,我已经回答了你的问题。您的查询与索引无关。
-
现在我 100% 确定您在此发布的内容不是。相比之下,您更新的解释计划和查询完全不同。能否请您发布一个 Oracle 会话的输出。
-
嗨,我用精确查询更新了问题,我截断了表格并添加了 1 行精确匹配以保持简单,因为我只想看到索引正常工作。
标签: sql oracle indexing sqlplus