繁体   English   中英

传递大数据时,sql 查询挂起/超时

[英]sql query hangs/times out when passed large data

更新:伙计们,我正在将教员 ID 列表传递给存储过程,当我传递超过 10 个教员 ID 时,处理数据需要很长时间并且有时会超时。 我花了很多时间调试这个查询,并发现 proc 中的最后一行导致查询超时/响应时间变慢。 最后一行是 CTE 的 subquering。 如何重写/优化 proc 的最后一行以使我的查询运行得更快。 任何帮助将不胜感激。 有人可以帮忙吗?

create or replace PROCEDURE sp_Test(
facultycode IN  varchar2
//few more variables
---
---
p_result OUT sys_refcursor
)
AS
open recordset for 
//this parses list of id's i.e('101''102''104'108') and i am calling this in last line of my proc
with faculty_list as (
SELECT REGEXP_SUBSTR(facultycode,'[^,]+',1,LEVEL) AS FAC_CODE
         FROM DUAL              
    CONNECT BY LEVEL <=LENGTH (REGEXP_REPLACE(facultycode,'[^,]+'))+1
    )

select s.s_name, m.score, s.status
 from student s 
join marks m on s.s_id = m.s_id 
WHERE S.GRADE>5
AND facultycode is null or s.fac_code in (select FAC_CODE from faculty_list); //this line 
is making query very slow, I need to optimize this line for faster response
END sp_Test;

您可以尝试在 Faculty_list 中使用 /*+ MATERIALIZE */ 提示和子句子查询。 一般来说,我会说性能主要取决于是否对 student.faculty_code 进行了索引,您可以将成绩添加到该索引中

create index student_fac_grade_idx on student (fac_code, grade);

如果你有这个索引和实现 hing,那么你就有最好的机会表现得很好。 以下内容也适用于空输入列表:

with in_list as
(
select '101,102,104,108,201,202,204,208,301,402,504,608' in_list from dual
--select '' in_list from dual
)
, faculty_list as 
(
SELECT /*+ MATERIALIZE */ REGEXP_SUBSTR(in_list,'[^,]+',1,LEVEL) AS FAC_CODE
         FROM DUAL , in_list    
    CONNECT BY LEVEL <=LENGTH (REGEXP_REPLACE(in_list,'[^,]+'))+1
)
--select * from faculty_list ;
, student as
(
select 1 s_id, 'Joe' s_name, 'ACTIVE' status , 6 grade, 101 fac_code from dual
)
, marks as
(
select 1 s_id, 100 score from dual
)
/* main query */
select s.s_name, m.score, s.status
from student s 
join marks m on s.s_id = m.s_id 
WHERE S.GRADE>5
and (s.fac_code in (select FAC_CODE from faculty_list)
or (select fac_code from faculty_list ) is null)
;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM