这SQL。。。。。咋优化,不到5000条数据查一下要10秒。。。。

ヘ小女子 发布于 2017/06/01 13:10
阅读 2K+
收藏 3

如题,只有4000条数据,查询要10秒。。。

大神指点下。

 

SELECT DISTINCT 
  A.* 
FROM
  (SELECT 
    act.srt_id,
    act.act_id,
    act.act_type_cd,
    act.act_status_cd,
    org.organ_party_id,
    grp.party_fullname,
    DATE_FORMAT(
      act.crt_dttm,
      '%Y-%m-%d %H:%i:%s'
    ),
    CONCAT(
      emp.EMPLOYEE_NAME,
      ',',
      IFNULL(emp2.EMPLOYEE_NAME, '')
    ) employee_name,
    srt.PROJECT_NAME,
    srt.PROJECT_PARTY_FULLNAME 
  FROM
    t_cc_employee emp 
    LEFT JOIN T_CC_ORGAN ORG 
      ON ORG.ORGAN_PARTY_ID = EMP.ORGAN_PARTY_ID,
    (SELECT 
      V.LONG_ SRT_ID,
      T.ID_ ACT_ID,
      V.PROC_INST_ID_,
      UPPER(T.TASK_DEF_KEY_) DKEY,
      CASE
        WHEN UPPER(RP.KEY_) = 'APPLYPROCESS' 
        THEN '01' 
        WHEN UPPER(RP.KEY_) = 'RELEASEPROCESS' 
        THEN '02' 
        WHEN UPPER(RP.KEY_) = 'EXPDPROCESS' 
        THEN '03' 
        WHEN UPPER(RP.KEY_) = 'DELAYPROCESS' 
        THEN '10' 
        WHEN UPPER(RP.KEY_) = 'TENANTRESOURCEAPPLYPROCESS' 
        THEN '15' 
        WHEN UPPER(RP.KEY_) = 'DEVOPSPROCESS' 
        THEN '11' 
        WHEN UPPER(RP.KEY_) = 'TROUBLESOLVEPROCESS' 
        THEN '12' 
        WHEN UPPER(RP.KEY_) = 'SCENEIMAGEPROCESS' 
        THEN '13' 
        WHEN UPPER(RP.KEY_) = 'TENANTQUOTAAPPLYPROCESS' 
        THEN '14' 
        WHEN UPPER(RP.KEY_) = 'TENANTCLONEPROCESS' 
        THEN '16' 
        WHEN UPPER(RP.KEY_) = 'TENANTRELEASEPROCESS' 
        THEN '17' 
        WHEN UPPER(RP.KEY_) = 'TENANTEXPDPROCESS' 
        THEN '18' 
        WHEN UPPER(RP.KEY_) = 'TENANTDELAYPROCESS' 
        THEN '19' 
        WHEN UPPER(RP.KEY_) = 'TENANTDEVOPSPROCESS' 
        THEN '20' 
        WHEN UPPER(RP.KEY_) = 'TENANTTROUBLESOLVEPROCESS' 
        THEN '21' 
        ELSE '09' 
      END ACT_TYPE_CD,
      CASE
        WHEN T.DELETE_REASON_ IS NULL 
        THEN '01' 
        ELSE '04' 
      END ACT_STATUS_CD,
      T.START_TIME_ CRT_DTTM,
      CASE
        WHEN K.GROUP_ID_ IS NULL 
        THEN L.USERGRP_PARTY_ID 
        ELSE K.GROUP_ID_ 
      END OWNER_GRP,
      CASE
        WHEN K.USER_ID_ IS NOT NULL 
        THEN K.USER_ID_ 
        ELSE T.ASSIGNEE_ 
      END OWNER_ID,
      (SELECT 
        B.ASSIGNEE_ 
      FROM
        ACT_HI_TASKINST B 
      WHERE T.EXECUTION_ID_ = B.EXECUTION_ID_ 
        AND CONVERT(T.ID_, SIGNED) >= CONVERT(B.ID_, SIGNED) 
      ORDER BY CONVERT(B.ID_, SIGNED) ASC 
      LIMIT 1) CRT_USER_ID,
      T.END_TIME_ LASTUPT_DTTM,
      CASE
        WHEN T.END_TIME_ IS NULL 
        THEN NULL 
        ELSE T.ASSIGNEE_ 
      END LASTUPT_USER_ID 
    FROM
      ACT_HI_TASKINST T,
      ACT_HI_IDENTITYLINK K 
      LEFT JOIN T_CC_PARTY_LINK L 
        ON (
          K.GROUP_ID_ IS NULL 
          AND K.USER_ID_ IS NOT NULL 
          AND K.USER_ID_ = L.USER_PARTY_ID
        ),
      ACT_HI_VARINST V,
      ACT_HI_PROCINST HP,
      ACT_RE_PROCDEF RP 
    WHERE (
        T.ID_ = K.TASK_ID_ 
        OR (
          T.PROC_INST_ID_ = K.PROC_INST_ID_ 
          AND T.ASSIGNEE_ = K.USER_ID_ 
          AND UPPER(T.TASK_DEF_KEY_) = 'MODIFYAPPLY'
        )
      ) 
      AND V.PROC_INST_ID_ = T.PROC_INST_ID_ 
      AND V.PROC_INST_ID_ = T.PROC_INST_ID_ 
      AND T.PROC_INST_ID_ = HP.PROC_INST_ID_ 
      AND HP.PROC_DEF_ID_ = RP.ID_ 
      AND UPPER(V.NAME_) = 'SRTAPPLYID') act 
    LEFT JOIN 
      (SELECT 
        srt.SRT_ID,
        srt.TAKE_OVER_ORGAN,
        subSrt.PROJECT_NAME,
        o.PARTY_FULLNAME PROJECT_PARTY_FULLNAME,
        subSrt.ENV_CODE USEAGE_ENV 
      FROM
        (SELECT 
          t.`SRT_ID`,
          p.`PROJECT_ID`,
          p.`PROJECT_NAME`,
          p.`ORGAN_PARTY_ID`,
          p.`ENV_CODE` 
        FROM
          T_CC_APPLY_RESOURCE t,
          T_CC_PROJECT_INFO p 
        WHERE t.`PROJECT_ID` = p.`PROJECT_ID` 
        UNION
        ALL 
        SELECT 
          t.`SRT_ID`,
          p.`PROJECT_ID`,
          p.`PROJECT_NAME`,
          p.`ORGAN_PARTY_ID`,
          p.`ENV_CODE` 
        FROM
          T_CC_RELEASE_RESOURCE t,
          T_CC_PROJECT_INFO p 
        WHERE t.`PROJECT_ID` = p.`PROJECT_ID` 
        UNION
        ALL 
        SELECT 
          t.`SRT_ID`,
          p.`PROJECT_ID`,
          p.`PROJECT_NAME`,
          p.`ORGAN_PARTY_ID`,
          p.`ENV_CODE` 
        FROM
          T_CC_EXPD_CAPACITY t,
          T_CC_PROJECT_ASS a,
          T_CC_PROJECT_INFO p 
        WHERE t.`INSTANCE_ID` = a.`APPLY_RESOURCE_ID` 
          AND a.`PROJECT_ID` = p.`PROJECT_ID` 
        UNION
        ALL 
        SELECT 
          t.`SRT_ID`,
          '',
          '',
          '',
          '' 
        FROM
          T_CC_SCENE_IMAGE t 
        UNION
        ALL 
        SELECT 
          t.`SRT_ID`,
          p.`PROJECT_ID`,
          p.`PROJECT_NAME`,
          p.`ORGAN_PARTY_ID`,
          p.`ENV_CODE` 
        FROM
          T_CC_DEVOPS t,
          T_CC_PROJECT_ASS a,
          T_CC_PROJECT_INFO p 
        WHERE t.`APPLY_RESOURCE_ID` = a.`APPLY_RESOURCE_ID` 
          AND a.`PROJECT_ID` = p.`PROJECT_ID`) subSrt 
        LEFT JOIN T_CC_ORGAN o 
          ON SUBSRT.ORGAN_PARTY_ID = O.ORGAN_PARTY_ID,
        T_CC_SRT srt 
      WHERE subSrt.SRT_ID = srt.SRT_ID) srt 
      ON act.SRT_ID = srt.SRT_ID 
    LEFT JOIN t_cc_user_grp grp 
      ON grp.usergrp_party_id = act.owner_grp 
    LEFT JOIN t_cc_employee emp2 
      ON emp2.user_party_id = act.owner_id 
  WHERE 1 = 1 
    AND act.dkey <> 'MODIFYAPPLY' 
    AND emp.user_party_id = act.crt_user_id 
    AND act.act_status_cd = '04' 
  ORDER BY act.crt_dttm DESC,
    (act.act_id + 0) DESC) A 

加载中
8
1
士别三日
士别三日

建议先完整地了解业务,然后不看这条sql,完全重写。遵循以下原则

1.确定基准表,就是你的最终结果是依据哪张表产生的,先对这张基准表做最大化的过滤。然后用过滤后的结果join其他表。

2.一些计算复杂的sql逻辑通过中间表或物化视图提前计算好,在产生业务数据的时候,顺带把这些中间结果计算出来。

3.添加必要的索引

1
罗一鸣
罗一鸣

这个SQL的优化不是不能做,但是没有什么意义,建议可以这样子改造:

1、首先一些基础配置信息做成缓存形式,缓存要定时过期或者主动更新

2、查询的时候使用单表查询或者简单的join筛选出需要展示的数据主体,禁止子查询和嵌套查询

3、然后在程序中通过数据循环、组装、清洗的方式进行处理,要知道程序代码循环并处理5000条数据,也就几个毫秒之内

4、最后如果还是有问题的话那明显是数据库设计不合理,需要进行改造。

正常java代码使用mysql取数,在表数据量不超过千万的情况下,好的表结构和代码设计,取5000行数据性能基本可以保证在30毫秒以内。

 

 

 

0
dyfire
dyfire

碉堡了

0
就是个精虫上脑的地方
就是个精虫上脑的地方

能不能拆开用程序解决?  说实话 根本不想看内容

0
skhuhu
skhuhu

 你不怕吗···万一那天10万条数据呢····你不是挂了嘛·····

0
小灰灰Blog
小灰灰Blog

同上,完全没有读的欲望

0
湖水没了
湖水没了

逻辑前置,减少持久层的业务逻辑

0
飘零清风
飘零清风

看一眼就头疼。。根本不想读。。。

0
ヘ小女子
ヘ小女子

我想说,我也是看一眼就不想读的。。。但是我的前辈们已经这样写了,并且已经走了,并且让我优化,我也很绝望。。。。。

 

返回顶部
顶部