如何加快这个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 Developer 上的 REGEX LEVEL 查询
如何加快这个 SELECT CONCAT/GROUP BY 查询?