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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何加快这个oracle选择查询?相关的知识,希望对你有一定的参考价值。

我在代码中有以下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秒。

答案

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

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

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';

以上是关于如何加快这个oracle选择查询?的主要内容,如果未能解决你的问题,请参考以下文章

加快oracle sql删除查询[重复]

如何加快 Oracle SQL Developer 上的 REGEX LEVEL 查询

如何加快这个 SELECT CONCAT/GROUP BY 查询?

Oracle Forms - 如何加快 POST_QUERY 触发器?

如何加快 Oracle 中的 row_number?

加快缓慢的 oracle 查询