我已创建了连接Oracle中几个表的aquery,但执行时间非常慢,大约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;
答案 0 :(得分:-1)
您应该为where
部分中涉及的每个变量创建索引。您可以为所有字段创建简单索引或复合。
Create Index
代表WHERE
上的每个字段,而不仅仅是主键
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
此外,您可以使用Explain Plan查看正在执行查询的内容。有时甚至当你添加索引时,规划者决定不使用它。这取决于您的数据大小。
ADDED notes。
USE INNER JOIN
而不是WHERE
syntaxis,这不会提高效果只是为了更好的阅读
您可以尝试创建隐式表而不是使用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;