[英]Oracle Sql performance very slow
我在 Oracle 中创建了一个连接多个表的查询,但是执行时间很慢,大约 1-2 分钟。 有没有一种方法可以使查询更快?
SELECT S.ID STAFF_ID,
d.year_enrol,
C.COUNSELLOR_ID,
count(*) Num_Of_Stud
FROM aab_ASSIGNED_COUNSELLOR C,
aab_STAFF S,
v_aab_student d
WHERE C.COUNSELLOR_ID = S.COUNSELLOR_ID
AND SYSDATE BETWEEN C.EFFECTIVE_DATE_FM AND C.EFFECTIVE_DATE_TO
AND C.HOST_COUNSELLOR_IND = 'Y'
AND c.student_num = d.student_num
AND (d.prog_code, d.subcode) NOT IN (('11345',' '),
('22678',' '),
('93451', ' '),
('62378','OPT'))
GROUP BY S.ID,
d.year_enrol,
C.COUNSELLOR_ID;
您应该为where
部分中涉及的每个变量创建索引。 您可以为所有字段创建简单索引或组合。
为WHERE
上的每个字段Create Index
,而不仅仅是主键
aab_ASSIGNED_COUNSELLOR
COUNSELLOR_ID
EFFECTIVE_DATE_FM
HOST_COUNSELLOR_IND
student_num
aab_STAFF
COUNSELLOR_ID
v_aab_student
student_num
prog_code
subcode
您也可以使用解释计划来查看查询的内容。 有时即使您添加索引,规划器也决定不使用它。 这取决于您的数据大小。
添加了注释。
使用INNER JOIN
而不是WHERE
语法,这不会提高性能只是为了更好的阅读
您可以尝试创建一个隐式表而不是使用IN
。 使用Left JOIN
和T.prog_code IS NULL
来解决问题。
SELECT s.id staff_id, d.year_enrol, c.counsellor_id, Count(*) num_of_stud
FROM aab_assigned_counsellor C
INNER JOIN aab_staff S,
ON c.counsellor_id = s.counsellor_id
INNER JOIN v_aab_student D
ON c.student_num = d.student_num
LEFT JOIN
(
SELECT '11345' prog_code, ' ' subcode
UNION
SELECT '22678' prog_code, ' ' subcode
UNION
SELECT '93451' prog_code, ' ' subcode
UNION
SELECT '62378' prog_code, 'OPT' subcode
) AS T
ON D.prog_code = T.prog_code
AND D.subcode = T.subcode
WHERE C.host_counsellor_ind = 'Y'
AND T.prog_code IS NULL
AND sysdate BETWEEN C.effective_date_fm AND C.effective_date_to
GROUP BY S.id, D.year_enrol, C.counsellor_id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.