성적처리 전체 쿼리튜닝

This commit is contained in:
iyak 2025-09-18 04:58:55 +00:00
parent f1c986a2f6
commit f08159828b
1 changed files with 150 additions and 1 deletions

View File

@ -966,7 +966,154 @@
order by a.rno
</select>
<!-- 성적처리 전체 튜닝 HS - (기존 롤백용 grade.lectgradesToAll_hsbk) -->
<select id="grade.lectgradesToAll" parameterClass="hashtable" resultClass="lect">
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
WITH
filtered_lect AS (
SELECT
b.lectno, a.cmno, b.cmisno, b.userno, b.payno
, b.isrebate, b.attrate, b.iscomplete, b.sdate, b.edate
, a.cshape, e.eend, e.studyplace, p.payoktime
FROM cm a
INNER JOIN lect b ON b.cmno = a.cmno AND b.status = 1 AND b.ischanged = 0
INNER JOIN cm c2 ON c2.cmno = a.pcmno
INNER JOIN users u ON u.userno = b.userno
INNER JOIN pay p ON p.payno = b.payno
LEFT OUTER JOIN cminningscd e ON e.cmisno = b.cmisno
LEFT OUTER JOIN assign ua ON ua.asno=u.asno
WHERE 1=1
AND a.ismaster = 0 AND a.isdel = 0
<dynamic>
<isEqual property="LeaveUserView" compareValue="N"><![CDATA[AND u.status < 99]]></isEqual>
<isNotNull property="usernamestr"><![CDATA[AND u.username LIKE CONCAT('%', #usernamestr#, '%')]]></isNotNull>
<isNotNull property="useridstr"><![CDATA[AND u.userid LIKE CONCAT('%', #useridstr#, '%')]]></isNotNull>
<isNotEmpty property="usernameid"><![CDATA[AND (u.userid LIKE CONCAT('%', #usernameid#, '%') OR u.username LIKE CONCAT('%', #usernameid#, '%') OR u.usernameeng LIKE CONCAT('%', #usernameid#, '%'))]]></isNotEmpty>
<isNotNull property="asname"><![CDATA[AND ua.asname LIKE CONCAT('%', #asname#, '%')]]></isNotNull>
<isNotNull property="mobile"><![CDATA[AND CAST(AES_DECRYPT(UNHEX(u.mobile), 'np123@!') AS CHAR) LIKE CONCAT('%', #mobile#, '%')]]></isNotNull>
<isNotNull property="cmno"><![CDATA[AND a.cmno = #cmno#]]></isNotNull>
<isNotNull property="cname"><![CDATA[AND (c2.cname LIKE CONCAT('%', #cname#, '%') OR a.cname LIKE CONCAT('%', #cname#, '%'))]]></isNotNull>
<isNotNull property="cnamestr"><![CDATA[AND a.cname LIKE CONCAT('%', #cnamestr#, '%')]]></isNotNull>
<isNotNull property="cshape"><![CDATA[AND a.cshape = #cshape#]]></isNotNull>
<isNotNull property="iscomplete"><![CDATA[AND IFNULL(b.iscomplete, 0) = #iscomplete#]]></isNotNull>
<isNotNull property="cmisno"><![CDATA[AND b.cmisno = #cmisno#]]></isNotNull>
<isNotNull property="studyplace"><![CDATA[AND e.studyplace = #studyplace#]]></isNotNull>
<isNotEmpty property="edateall"><![CDATA[AND ((a.cshape <> 2 AND b.edate <= DATE_FORMAT(#edateall#, '%Y-%m-%d 23:59:59')) OR (a.cshape = 2 AND e.eend IS NOT NULL AND e.eend <= DATE_FORMAT(#edateall#, '%Y-%m-%d 23:59:59')) OR (a.cshape = 2 AND e.eend IS NULL AND b.edate <= DATE_FORMAT(#edateall#, '%Y-%m-%d 23:59:59')))]]></isNotEmpty>
<isNotNull property="edate"><![CDATA[AND DATE_FORMAT((CASE WHEN a.cshape = 2 AND e.eend IS NOT NULL THEN e.eend ELSE b.edate END), '%Y-%m-%d') = #edate#]]></isNotNull>
<isNotNull property="edate1"><![CDATA[AND (CASE WHEN a.cshape = 2 AND e.eend IS NOT NULL THEN e.eend ELSE b.edate END) >= #edate1#]]></isNotNull>
<isNotNull property="edate2"><![CDATA[AND (CASE WHEN a.cshape = 2 AND e.eend IS NOT NULL THEN e.eend ELSE b.edate END) <= #edate2#]]></isNotNull>
<isNotEmpty property="sdateall"><![CDATA[AND (CASE WHEN a.cshape = 0 AND b.isrebate = 0 THEN p.payoktime ELSE b.sdate END) >= DATE_FORMAT(#sdateall#, '%Y-%m-%d 00:00:00')]]></isNotEmpty>
</dynamic>
),
aggregated_scores AS (
SELECT
fl.lectno, fl.cmno, fl.isrebate, fl.attrate
, COUNT(DISTINCT CASE WHEN ex.extype = 0 THEN ex.exno END) AS ex0cnt, COUNT(DISTINCT CASE WHEN ex.extype = 0 THEN lex.lectno END) AS ex0lectcnt, AVG(CASE WHEN ex.extype = 0 AND ex.tpoint > 0 THEN IFNULL(lex.tpoint, 0) / ex.tpoint * 100 ELSE 0 END) AS ex0lectpoint
, COUNT(DISTINCT CASE WHEN ex.extype = 1 THEN ex.exno END) AS ex1cnt, COUNT(DISTINCT CASE WHEN ex.extype = 1 THEN lex.lectno END) AS ex1lectcnt, AVG(CASE WHEN ex.extype = 1 AND ex.tpoint > 0 THEN IFNULL(lex.tpoint, 0) / ex.tpoint * 100 ELSE 0 END) AS ex1lectpoint
, COUNT(DISTINCT CASE WHEN sd.sdtype = 0 THEN sd.sdno END) AS sd0cnt, COUNT(DISTINCT CASE WHEN sd.sdtype = 0 THEN lsd.lectno END) AS sd0lectcnt, AVG(CASE WHEN sd.sdtype = 0 AND sd.tpoint > 0 THEN IFNULL(lsd.cpoint, 0) / sd.tpoint * 100 ELSE 0 END) AS sd0lectpoint
, COUNT(DISTINCT CASE WHEN sd.sdtype = 1 THEN sd.sdno END) AS sd1cnt, COUNT(DISTINCT CASE WHEN sd.sdtype = 1 THEN lsd.lectno END) AS sd1lectcnt, AVG(CASE WHEN sd.sdtype = 1 AND sd.tpoint > 0 THEN IFNULL(lsd.cpoint, 0) / sd.tpoint * 100 ELSE 0 END) AS sd1lectpoint
, COUNT(DISTINCT CASE WHEN rs.rstype = 0 THEN rs.rsno END) AS rs0cnt, COUNT(DISTINCT CASE WHEN rs.rstype = 0 THEN lrs.lectno END) AS rs0lectcnt
, COUNT(DISTINCT ci.cmino) AS at0cnt, COUNT(DISTINCT li.lectno) AS at0lectcnt
FROM filtered_lect fl
LEFT JOIN cmex ex ON ex.cmno = fl.cmno AND ex.isdel = 0 LEFT JOIN lectex lex ON lex.lectno = fl.lectno AND lex.exno = ex.exno
LEFT JOIN cmsd sd ON sd.cmno = fl.cmno AND sd.isdel = 0 LEFT JOIN lectsd lsd ON lsd.lectno = fl.lectno AND lsd.sdno = sd.sdno
LEFT JOIN cmrs rs ON rs.cmno = fl.cmno AND rs.rstype = 0 AND rs.isdel = 0 LEFT JOIN lectrs lrs ON lrs.lectno = fl.lectno AND lrs.rsno = rs.rsno
LEFT JOIN cminning ci ON ci.cmno = fl.cmno AND ci.isonline = 0 AND ci.isscd = 1 LEFT JOIN lectinning li ON li.cmino = ci.cmino AND li.lectno = fl.lectno AND li.istatus = 2
GROUP BY fl.lectno, fl.cmno, fl.isrebate, fl.attrate
),
final_scores AS (
SELECT
a.*
, (a.attrate / 100) * (CASE WHEN a.isrebate = 1 THEN d.attendrfd ELSE d.attend END) AS apoint, (IFNULL(a.ex0lectpoint, 0) / 100) * (CASE WHEN a.isrebate = 1 THEN d.midrfd ELSE d.mid END) AS mpoint
, (IFNULL(a.ex1lectpoint, 0) / 100) * (CASE WHEN a.isrebate = 1 THEN d.finalrfd ELSE d.final END) AS fpoint, (IFNULL(a.sd0lectpoint, 0) / 100) * (CASE WHEN a.isrebate = 1 THEN d.subjectrfd ELSE d.subject END) AS spoint
, (IFNULL(a.sd1lectpoint, 0) / 100) * (CASE WHEN a.isrebate = 1 THEN d.discussrfd ELSE d.discuss END) AS dpoint
, CASE WHEN (CASE WHEN a.isrebate=1 THEN d.attendcutrfd ELSE d.attendcut END) &lt;= a.attrate THEN 1 ELSE 0 END AS ispassa
, CASE WHEN (CASE WHEN a.isrebate=1 THEN d.midcutrfd ELSE d.midcut END) &lt;= a.ex0lectpoint THEN 1 ELSE 0 END AS ispassm
, CASE WHEN (CASE WHEN a.isrebate=1 THEN d.finalcutrfd ELSE d.finalcut END) &lt;= a.ex1lectpoint THEN 1 ELSE 0 END AS ispassf
, CASE WHEN (CASE WHEN a.isrebate=1 THEN d.subjectcutrfd ELSE d.subjectcut END) &lt;= a.sd0lectpoint THEN 1 ELSE 0 END AS ispasss
, CASE WHEN (CASE WHEN a.isrebate=1 THEN d.discusscutrfd ELSE d.discusscut END) &lt;= a.sd1lectpoint THEN 1 ELSE 0 END AS ispassd
, CASE WHEN (CASE WHEN IFNULL(d.isoffabs,0)=1 THEN IFNULL(a.at0cnt,0) ELSE 0 END) &lt;= IFNULL(a.at0lectcnt,0) THEN 1 ELSE 0 END AS ispassat
FROM aggregated_scores a
INNER JOIN cmev d ON d.cmno = a.cmno
)
SELECT *
FROM (
SELECT
fs.lectno, b.userno, b.payno
, ROW_NUMBER() OVER(ORDER BY <isNotNull property="orderby">$orderby$</isNotNull><isNull property="orderby">c.cname, c.cmno, u.username</isNull>) rno
, COUNT(fs.lectno) OVER() pagetotalcount
, b.isrebate, CASE WHEN ppl.asname IS NOT NULL THEN ppl.asname ELSE ua.asname END asname
, ppl.brno, ppl.ceoname, ppl.post, ppl.address1, ppl.address2, ppl.btype, ppl.bkind, ppl.eino, ppl.mname, ppl.association
, CAST(AES_DECRYPT(UNHEX(ppl.mphone), <include refid="sql.digest" />) AS CHAR) mphone, CAST(AES_DECRYPT(UNHEX(ppl.taxemail), <include refid="sql.digest" />) AS CHAR) taxemail
, u.username, u.userid, u.slevel, u.uduty
, b.iscomplete, b.completetime, b.completeno, b.sdate, b.edate, c.studydays
, CONCAT(SUBSTRING(CAST(AES_DECRYPT(UNHEX(u.userpno), <include refid="sql.digest" />) AS CHAR),1,6),'-',SUBSTRING(CAST(AES_DECRYPT(UNHEX(u.userpno),<include refid="sql.digest" />) AS CHAR),7,7)) userpno
, CAST(AES_DECRYPT(UNHEX(u.mobile), <include refid="sql.digest" />) AS CHAR) mobile
, b.cmisno, p.payoktime, p.payamt, c.cshape, c.sstime, c.cmno, c.cname, c.classno, c.studytime, t.tyear
, cg.cgname, cg.pcgno, pcg.cgname AS pcgname, d.isoffabs
, b.attrate, fs.apoint, fs.mpoint, fs.fpoint, fs.spoint, fs.dpoint
, fs.ex0cnt, fs.ex0lectcnt, fs.ex0lectpoint, fs.ex1cnt, fs.ex1lectcnt, fs.ex1lectpoint
, fs.sd0cnt, fs.sd0lectcnt, fs.sd0lectpoint, fs.sd1cnt, fs.sd1lectcnt, fs.sd1lectpoint
, fs.rs0cnt, fs.rs0lectcnt, fs.ispassat
, fs.ispassa, fs.ispassm, fs.ispassf, fs.ispasss, fs.ispassd
, e.sseq, e.estart, e.eend, e.studyplace, f.istatus
, cc.cname studyplacename, tm.cname typemanname, te.cname typeeduname
, tg.cname typegradename, tj.cname typejobname
, DATE_FORMAT((CASE WHEN c.cshape = 2 AND e.eend IS NOT NULL THEN e.eend ELSE b.edate END),'%Y-%m-%d') edatestring
, pi.tbankuser rbankuser, pi.rbank, pi.pino, pi.rbankamt
, CAST(AES_DECRYPT(UNHEX(pi.rbankaccnum), <include refid="sql.digest" />) AS CHAR) AS rbankaccnum
, DATE_FORMAT(f.stime, '%Y-%m-%d') zstring3, cc2.cname AS zstring0
FROM final_scores fs
INNER JOIN lect b ON b.lectno = fs.lectno
INNER JOIN pay p ON p.payno = b.payno
INNER JOIN users u ON u.userno = b.userno
LEFT OUTER JOIN assign ua ON ua.asno = u.asno
INNER JOIN cm c ON c.cmno = b.cmno
INNER JOIN cmev d ON d.cmno = c.cmno
LEFT OUTER JOIN term t ON t.tmno = c.tmno
LEFT OUTER JOIN cg cg ON cg.cgno = c.cgno
LEFT OUTER JOIN cg pcg ON pcg.cgno = cg.pcgno
LEFT OUTER JOIN payitem pi ON pi.payno = p.payno
LEFT OUTER JOIN cminningscd e ON e.cmisno = b.cmisno
LEFT OUTER JOIN lectinning f ON f.lectno = b.lectno AND f.cmino = e.cmino
LEFT OUTER JOIN comcode cc ON cc.ccode = e.studyplace AND cc.isuse = 1
LEFT OUTER JOIN pplog ppl ON ppl.pplno = p.pplno
LEFT OUTER JOIN comcode cc2 ON ppl.typejobitem = cc2.ccode
LEFT OUTER JOIN comcode tm ON tm.ccode = ppl.typeman
LEFT OUTER JOIN comcode te ON te.ccode = ppl.typeedu
LEFT OUTER JOIN comcode tg ON tg.ccode = ppl.typegrade
LEFT OUTER JOIN comcode tj ON tj.ccode = ppl.typejob
WHERE 1=1
<dynamic>
<isNotNull property="est1not"><![CDATA[AND fs.ex0lectcnt < fs.ex0cnt]]></isNotNull>
<isNotNull property="est2not"><![CDATA[AND fs.ex1lectcnt < fs.ex1cnt]]></isNotNull>
<isNotNull property="est11not"><![CDATA[AND fs.sd0lectcnt < fs.sd0cnt]]></isNotNull>
<isNotNull property="est12not"><![CDATA[AND fs.sd1lectcnt < fs.sd1cnt]]></isNotNull>
<isNotNull property="est21not"><![CDATA[AND fs.rs0lectcnt < fs.rs0cnt]]></isNotNull>
<isNotNull property="ispasss"><![CDATA[AND ((fs.sd0cnt > 0 AND fs.sd0lectcnt > 0))]]></isNotNull>
<isNotNull property="ispassa"><![CDATA[AND fs.ispassa = #ispassa#]]></isNotNull>
<isNotNull property="ispassex"><![CDATA[AND (fs.ispassm = #ispassex# AND fs.ispassf = #ispassex#)]]></isNotNull>
<isNotNull property="attendance">
<isEqual property="attendance" compareValue="1"><![CDATA[AND IFNULL(d.isoffabs, 0) = 0]]></isEqual>
<isEqual property="attendance" compareValue="2"><![CDATA[AND IFNULL(d.isoffabs, 0) = 1]]></isEqual>
<isEqual property="attendance" compareValue="3"><![CDATA[AND IFNULL(d.isoffabs, 0) = 1 AND f.istatus IS NULL]]></isEqual>
<isEqual property="attendance" compareValue="4"><![CDATA[AND IFNULL(d.isoffabs, 0) = 1 AND IFNULL(f.istatus, -1) = 2]]></isEqual>
<isEqual property="attendance" compareValue="5"><![CDATA[AND IFNULL(d.isoffabs, 0) = 1 AND IFNULL(f.istatus, -1) = 0]]></isEqual>
</isNotNull>
</dynamic>
) a
<include refid="sql.pagedynamic" />
ORDER BY a.rno
</select>
<!-- grade.lectgradesToAll 에 대한 백업 -->
<select id="grade.lectgradesToAll_hsbk" parameterClass="hashtable" resultClass="lect">
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
select a.*
from (
select a.lectno,b.userno,b.payno
@ -1349,6 +1496,8 @@
order by a.rno
</select>
<!--#xodus-->
<select id="grade.lectgradesToAll2_old" parameterClass="hashtable" resultClass="lect">
select *