请问 大佬们这个段 sql 怎么优化?急 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hemingyang
V2EX    问与答

请问 大佬们这个段 sql 怎么优化?急

  •  
  •   hemingyang 2020-12-31 15:15:53 +08:00 1582 次点击
    这是一个创建于 1797 天前的主题,其中的信息可能已经有所发展或是发生改变。

    select distinct RE.* from ( SELECT R.ID_ id, to_number(T.PROC_INST_ID_) processInstanceId, Q.TEXT_ busiType, P.NAME_ definitionName, TO_DATE(TO_CHAR(T.START_TIME_, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') createTime, DECODE(NVL(L.PROC_INST_ID_, 0), 0, TO_DATE(null, 'YYYY-MM-DD'), TO_DATE(TO_CHAR(T.END_TIME_, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS')) endTime, R.NAME_ curName, ( SELECT USERNAME || '(' || REALNAME || ')' FROM t_System_User WHERE id = T.START_USER_ID_ ) AS startUserId, (SELECT ur.phone from T_SYSTEM_USER ur where ur.id=T.START_USER_ID_) as sqrlxdh, ( SELECT u1.DEPARTMENT FROM t_System_User u1 WHERE id = T.START_USER_ID_ ) AS startUserXx, (SELECT TK.ASSIGNEE_ FROM ACT_RU_TASK TK WHERE TK.PROC_INST_ID_ = T.PROC_INST_ID_ AND TK.ASSIGNEE_ IS NOT NULL) assignee, (SELECT UR.REALNAME FROM T_SYSTEM_USER UR WHERE UR.ID = (SELECT TK.ASSIGNEE_ FROM ACT_RU_TASK TK WHERE TK.PROC_INST_ID_ = T.PROC_INST_ID_ AND TK.ASSIGNEE_ IS NOT NULL)) assigneeName, (SELECT ur.phone from T_SYSTEM_USER ur where ur.id=(SELECT TK.ASSIGNEE_ FROM ACT_RU_TASK TK WHERE TK.PROC_INST_ID_ = T.PROC_INST_ID_ AND TK.ASSIGNEE_ IS NOT NULL)) as jsrlxdh FROM ACT_HI_PROCINST T, ACT_HI_VARINST Q, ACT_RE_PROCDEF P, ACT_HI_ACTINST L, (SELECT T1.*, ROW_NUMBER() OVER(PARTITION BY T1.PROC_INST_ID_ ORDER BY T1.START_TIME_ DESC NULLS LAST) RN FROM ACT_HI_TASKINST T1) R, T_SYSTEM_USER U WHERE T.PROC_INST_ID_ = R.PROC_INST_ID_ AND T.PROC_INST_ID_ = Q.PROC_INST_ID_ AND Q.NAME_ = 'busiType' AND P.ID_ = T.PROC_DEF_ID_ AND T.PROC_INST_ID_ = L.PROC_INST_ID_(+) AND T.START_USER_ID_ = U.ID AND L.ACT_TYPE_(+) = 'endEvent' AND R.RN = '1' AND EXISTS (SELECT 1 FROM ACT_HI_TASKINST Q WHERE Q.PROC_INST_ID_ = T.PROC_INST_ID_ AND Q.ASSIGNEE_ = 'abebf5330c71440ab6a4719e535b8129') and not exists ( select 1 from ACT_RU_TASK RES LEFT JOIN ACT_RU_IDENTITYLINK I ON I.TASK_ID_ = RES.ID_ LEFT JOIN ACT_RU_EXECUTION REX ON REX.PROC_INST_ID_ = RES.PROC_INST_ID_ WHERE RES.SUSPENSION_STATE_ = 1 AND REX.PARENT_ID_ IS NULL and res.ID_ = r.ID_ AND ( RES.ASSIGNEE_ = 'abebf5330c71440ab6a4719e535b8129' OR ( RES.ASSIGNEE_ IS NULL AND I.TYPE_ = 'candidate' AND ( I.USER_ID_ = 'abebf5330c71440ab6a4719e535b8129' OR I.GROUP_ID_ IN ( SELECT g.ID_ FROM ACT_ID_GROUP g, ACT_ID_MEMBERSHIP membership WHERE g.ID_ = membership.GROUP_ID_ AND membership.USER_ID_ = 'abebf5330c71440ab6a4719e535b8129' )) ) ) )

     ) RE ORDER BY endTime DESC, createTime DESC 
    9 条回复    2020-12-31 17:19:08 +08:00
    l00t
        1
    l00t  
       2020-12-31 15:53:08 +08:00
    你这发给谁看?为什么要优化?要优化成什么样?
    npe
        2
    npe  
       2020-12-31 15:59:22 +08:00
    truncate table
    YYYYMMDDHHSS
        3
    YYYYMMDDHHSS  
       2020-12-31 16:34:27 +08:00
    根本不是会写 sql 的人写得出来的样子,sqlboy 如是说
    hemingyang
        4
    hemingyang  
    OP
       2020-12-31 16:36:39 +08:00
    @YYYYMMDDHHSS 大佬有方案吗
    hemingyang
        5
    hemingyang  
    OP
       2020-12-31 16:37:21 +08:00
    <h1>

    select distinct RE.* from (
    SELECT R.ID_ id,
    to_number(T.PROC_INST_ID_) processInstanceId,
    Q.TEXT_ busiType,
    P.NAME_ definitionName,
    TO_DATE(TO_CHAR(T.START_TIME_, 'YYYY-MM-DD HH24:MI:SS'),
    'YYYY-MM-DD HH24:MI:SS') createTime,
    DECODE(NVL(L.PROC_INST_ID_, 0),
    0,
    TO_DATE(null, 'YYYY-MM-DD'),
    TO_DATE(TO_CHAR(T.END_TIME_, 'YYYY-MM-DD HH24:MI:SS'),
    'YYYY-MM-DD HH24:MI:SS')) endTime,
    R.NAME_ curName,
    ( SELECT USERNAME || '(' || REALNAME || ')' FROM t_System_User WHERE id = T.START_USER_ID_ ) AS startUserId,
    (SELECT ur.phone from T_SYSTEM_USER ur where ur.id=T.START_USER_ID_) as sqrlxdh,
    ( SELECT u1.DEPARTMENT FROM t_System_User u1 WHERE id = T.START_USER_ID_ ) AS startUserXx,
    (SELECT TK.ASSIGNEE_
    FROM ACT_RU_TASK TK
    WHERE TK.PROC_INST_ID_ = T.PROC_INST_ID_
    AND TK.ASSIGNEE_ IS NOT NULL) assignee,
    (SELECT UR.REALNAME
    FROM T_SYSTEM_USER UR
    WHERE UR.ID =
    (SELECT TK.ASSIGNEE_
    FROM ACT_RU_TASK TK
    WHERE TK.PROC_INST_ID_ = T.PROC_INST_ID_
    AND TK.ASSIGNEE_ IS NOT NULL)) assigneeName,
    (SELECT ur.phone from T_SYSTEM_USER ur where ur.id=(SELECT TK.ASSIGNEE_
    FROM ACT_RU_TASK TK
    WHERE TK.PROC_INST_ID_ = T.PROC_INST_ID_
    AND TK.ASSIGNEE_ IS NOT NULL)) as jsrlxdh
    FROM ACT_HI_PROCINST T,
    ACT_HI_VARINST Q,
    ACT_RE_PROCDEF P,
    ACT_HI_ACTINST L,
    (SELECT T1.*,
    ROW_NUMBER() OVER(PARTITION BY T1.PROC_INST_ID_ ORDER BY T1.START_TIME_ DESC NULLS LAST) RN
    FROM ACT_HI_TASKINST T1) R,
    (SELECT u.id FROM ACT_HI_PROCINST T JOIN T_SYSTEM_USER U ON T.START_USER_ID_ = U.Id ) tr
    WHERE T.PROC_INST_ID_ = R.PROC_INST_ID_
    AND T.PROC_INST_ID_ = Q.PROC_INST_ID_
    AND Q.NAME_ = 'busiType'
    AND P.ID_ = T.PROC_DEF_ID_
    AND T.PROC_INST_ID_ = L.PROC_INST_ID_(+)
    AND L.ACT_TYPE_(+) = 'endEvent'
    AND T.START_USER_ID_ = tr.Id
    AND R.RN = '1'
    AND EXISTS (SELECT 1
    FROM ACT_HI_TASKINST Q
    WHERE Q.PROC_INST_ID_ = T.PROC_INST_ID_
    AND Q.ASSIGNEE_ = 'abebf5330c71440ab6a4719e535b8129')
    and not exists (
    select 1 from
    ACT_RU_TASK RES
    LEFT JOIN ACT_RU_IDENTITYLINK I ON I.TASK_ID_ = RES.ID_
    LEFT JOIN ACT_RU_EXECUTION REX ON REX.PROC_INST_ID_ = RES.PROC_INST_ID_
    WHERE RES.SUSPENSION_STATE_ = 1
    AND REX.PARENT_ID_ IS NULL
    and res.ID_ = r.ID_
    AND (
    RES.ASSIGNEE_ = 'abebf5330c71440ab6a4719e535b8129'
    OR (
    RES.ASSIGNEE_ IS NULL
    AND I.TYPE_ = 'candidate'
    AND ( I.USER_ID_ = 'abebf5330c71440ab6a4719e535b8129' OR I.GROUP_ID_ IN ( SELECT g.ID_ FROM ACT_ID_GROUP g, ACT_ID_MEMBERSHIP membership WHERE g.ID_ = membership.GROUP_ID_ AND membership.USER_ID_ = 'abebf5330c71440ab6a4719e535b8129' ))
    )
    )
    )



    ) RE
    ORDER BY endTime DESC, createTime DESC

    </h1>
    MIUIOS
        6
    MIUIOS  
       2020-12-31 16:39:33 +08:00
    直接甩一条 SQL 出来让人怎么优化。。。
    hemingyang
        7
    hemingyang  
    OP
       2020-12-31 16:42:10 +08:00
    @totoro52 就是 T_SYSTEM_USER 表数据很大 需要关联 ACT_HI_PROCINST 就会很慢
    NotFoundEgg
        8
    NotFoundEgg  
       2020-12-31 16:50:50 +08:00
    一看到 activiti 的引擎表就头疼

    也不说这是干啥的
    jtwor
        9
    jtwor  
       2020-12-31 17:19:08 +08:00
    子查询太多了 可以关联的 不要用 in 用 exists
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5490 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:39 PVG 09:39 LAX 17:39 JFK 20:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86