后台运行一个查询接口,需要执行10秒。

项目背景:物业运维APP,打开巡检工单,需要10秒。一个

一个巡检工单包含多个task,每个task包含多个option,需要连表查。

分析原因: 每个工单有约60个task,每个task有8个option。每查一个option,需要遍历option表(该表有10万+行记录)。合计 60*8*10万

原来的mapper中的sql

<resultMap id="orderTaskMap" type="com.zfzn.cwyms.property.entity.WyOrderPatrolTaskEntity">
<result property="areaName" column="areaName" javaType="String"/>
<result property="deviceName" column="deviceName" javaType="String"/>
<result property="areaAdress" column="areaAdress" javaType="String"/>
<result property="deviceAdress" column="deviceAdress" javaType="String"/>
<result property="patrolType" column="patrolType" javaType="String"/>
<result property="isException" column="isException" javaType="Integer"/>
<result property="dealTime" column="dealTime" javaType="Date"/>
<result property="state" column="state" javaType="String"/>
<result property="stateCode" column="stateCode" javaType="Integer"/>
<collection property="results" ofType="com.zfzn.cwyms.property.entity.WyOrderPlanTaskRlt"
select="findResultsByTaskId" column="taskId"/>
</resultMap>

<select id="findOrderTasksByOrderId" resultMap="orderTaskMap">
SELECT
<include refid="sqlSelectOrderPTaskColumn"/>
FROM wy_order_patrol_task task
LEFT OUTER JOIN wy_region_config rgn ON task.area_id = rgn.region_id
LEFT OUTER JOIN wy_build_floor af ON rgn.build_floor = af.floor_id
LEFT OUTER JOIN wy_build_config ab ON af.build = ab.build_id
LEFT OUTER JOIN wy_device_info dev ON task.device_id = dev.device_id
LEFT OUTER JOIN wy_build_config db ON dev.build = db.build_id
LEFT OUTER JOIN wy_region_config dgn ON dev.region = dgn.region_id
LEFT OUTER JOIN wy_build_floor df ON dev.build_floor = df.floor_id
LEFT OUTER JOIN wy_patrol_type tye ON task.task_type = tye.type
LEFT OUTER JOIN wy_order_patrol_task_state sta ON task.state = sta.state
WHERE task.patrol_order_id = #{orderId}
</select>

<select id="findResultsByTaskId" resultMap="resultMap">
SELECT
<include refid="sqlSelectOrderPTResultColumn"/>
FROM wy_order_patrol_result
WHERE task_id = #{taskId}
</select>

分析:在resultMap中有个collection,包含一个查询。

外部查询没查到一个任务,就会执行一遍colletion中查询(该查询去查那个最大的option表),

解决办法:把collection中查询去掉。放在外层查询。

SELECT
<includerefid="sqlSelectOrderPTaskColumn"/>, RST.idASrstId,RST.typeASoptionType, RST.nameAS
optionName,RST.position,RST.name_positiveASposName,RST.name_negativeASnegName,RST.unit,RST.alarm_minAS
valueMin,RST.alarm_maxASvalueMax,RST.choice_valueASchoiceValue,RST.input_valueASinputValue
FROMwy_order_patrol_resultRST
INNERJOINwy_order_patrol_tasktaskONtask.task_id=RST.task_id
LEFTOUTERJOINwy_region_configrgnONtask.area_id=rgn.region_id
LEFTOUTERJOINwy_build_floorafONrgn.build_floor=af.floor_id
LEFTOUTERJOINwy_build_configabONaf.build=ab.build_id
LEFTOUTERJOINwy_device_infodevONtask.device_id=dev.device_id
LEFTOUTERJOINwy_build_configdbONdev.build=db.build_id
LEFTOUTERJOINwy_region_configdgnONdev.region=dgn.region_id
LEFTOUTERJOINwy_build_floordfONdev.build_floor=df.floor_id
LEFTOUTERJOINwy_patrol_typetyeONtask.task_type=tye.type
LEFTOUTERJOINwy_order_patrol_task_statestaONtask.state=sta.state
WHEREtask.patrol_order_id=#{orderId}



<resultMapid="orderTaskMap"type="com.zfzn.cwyms.property.entity.WyOrderPatrolTaskEntity">
<resultproperty="areaName"column="areaName"javaType="String"/>
<resultproperty="deviceName"column="deviceName"javaType="String"/>
<resultproperty="areaAdress"column="areaAdress"javaType="String"/>
<resultproperty="deviceAdress"column="deviceAdress"javaType="String"/>
<resultproperty="patrolType"column="patrolType"javaType="String"/>
<resultproperty="isException"column="isException"javaType="Integer"/>
<resultproperty="dealTime"column="dealTime"javaType="Date"/>
<resultproperty="state"column="state"javaType="String"/>
<resultproperty="stateCode"column="stateCode"javaType="Integer"/>
<collectionproperty="results"resultMap="resultMap"ofType="com.zfzn.cwyms.property.entity.WyOrderPlanTaskRlt"/>
</resultMap>

更多相关文章

  1. Javascript学习:案例7--对象属性和方法的遍历、删除、添加.html
  2. 利用javascript实现遍历xml文件的代码实例
  3. js中ajax获取json数据遍历提示undefined
  4. python (9)统计文件夹下的所有文件夹数目、统计文件夹下所有文件数
  5. $.each遍历JSON字符串和 Uncaught TypeError: Cannot use 'in' o
  6. Python实现二叉树的左中右序遍历
  7. Python文件遍历的三种方法
  8. python_列表_循环遍历
  9. java中循环遍历删除List和Set集合中元素的方法

随机推荐

  1. 使用Android调用SOAP Webservice时连接被
  2. 2015年年终总结--迷茫中前进
  3. 这些片段在Android编程中很有用
  4. Android 屏幕分辨率
  5. 国内优秀Android学习资源
  6. Android Tab导航菜单栏--FragmentTabHost
  7. Robotium用例通过代码自动解锁屏幕
  8. Android之edittext取消默认弹出软键盘
  9. 设置自定义Dialog的大小和位置
  10. android studio 解析Excel数据格式导入po