Oracle Sql性能非常慢

时间:2015-09-25 02:39:17

标签: sql database oracle performance query-optimization

我已创建了连接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;

1 个答案:

答案 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 JOINT.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;