如何加快这个oracle选择查询?

问题描述 投票:0回答:1

我在代码中有以下sql查询,这使得查询变慢:

SELECT a.*,
         (SELECT CASE
                    WHEN (score IS NOT NULL OR comments IS NOT NULL)
                    THEN
                       ' ( score : ' || TO_CHAR (SCORE) || ' )'
                    ELSE
                       ' ( hələ )'
                 END
            FROM t_lecture_task_present b
           WHERE b.t_idx = a.t_idx AND B.STUDENT_ID = '{$member_code}')
            AS task_score
    FROM t_lecture_task a
   WHERE a.lec_open_idx = '24422'
ORDER BY s_date ASC, t_idx ASC

(16秒)

如果我没有尝试查询

(SELECT CASE
           WHEN (score IS NOT NULL OR comments IS NOT NULL)
           THEN
              ' ( score : ' || TO_CHAR (SCORE) || ' )'
           ELSE
              ' ( hələ )'
        END
   FROM t_lecture_task_present b
  WHERE b.t_idx = a.t_idx AND B.STUDENT_ID = '{$member_code}')
 as task_score

它工作得更快。

所以,我尝试删除or comments is not null,它的工作速度提高了2秒。

oracle select subquery where-clause
1个回答
1
投票

您无法比较产生不同结果的查询的性能:)

根据表中的数据分布,您可能会从这些索引中受益:

t_lecture_task(lec_open_idx) 
t_lecture_task_present(t_idx, student_id)

尝试重新编写查询以使用连接而不是标量子查询(选择为列)。它们不仅阅读起来更笨拙,而且更难以优化。

select a.*
      ,case when score    is not null 
              or comments is not null then ' ( score : ' || to_char (score) || ' )'
                                      else ' ( hələ )'
        end as task_score
  from t_lecture_task a
  left join t_lecture_task_present b on(
       b.t_idx      = a.t_idx
   and b.student_id = '{$member_code}')
  )
 where a.lec_open_idx = '24422';
© www.soinside.com 2019 - 2024. All rights reserved.