项目场景:
在使用达梦数据库开发的过程中
问题描述:
查询百万数据库的表,偶尔会碰到通过mybatis执行的语句,相对于在客户端执行的语句慢很多。
原因分析:
是由于我使用#{}绑定的参数类型,与数据库表字段的类型不一致造成的。造成入参传入的数据类型和数据库字段数据类型无法对应,且当数据量大时就会出现替换慢的问题。
List<TcTicketSum> selectPeopleByIssDt(@Param("beginTime") String beginTime,
@Param("endTime") String endTime);
<select id="selectPeopleByIssDt" resultType="com.csair.isa.domain.entity.TcTicketSum">
SELECT
AUDITOR_ID ,
TICKET_TYPE_END ,
MANUAL_AUDIT_FLAG ,
count(MANUAL_AUDIT_FLAG) as ticketCount
FROM
ACCA_TICKET_INFO
WHERE
ISS_DT between #{beginTime}
AND #{endTime}
AND AUDITOR_ID IS NOT NULL
AND AUDIT_TYPE IS NOT NULL
GROUP BY
TICKET_TYPE_END ,
AUDITOR_ID ,
MANUAL_AUDIT_FLAG
</select>
解决方案:
把传入的参数改为了Date类型,发现在mybatis里执行SQL有少许提升,但还是比在客户端执行SQL慢很多。
后来我经常多次尝试,把between改为了大于小于的方式查询。发现瞬间快了很多,基本与客户端执行的时间相差无几了。就是不知道这是什么原理,有大佬知道的求告知我一下。
List<TcTicketSum> selectPeopleByIssDt(@Param("beginTime") Date beginTime,
@Param("endTime") Date endTime);
<select id="selectPeopleByIssDt" resultType="com.csair.isa.domain.entity.TcTicketSum">
SELECT
AUDITOR_ID ,
TICKET_TYPE_END ,
MANUAL_AUDIT_FLAG ,
count(MANUAL_AUDIT_FLAG) as ticketCount
FROM
ACCA_TICKET_INFO
WHERE
ISS_DT > #{beginTime}
AND ISS_DT < #{endTime}
AND AUDITOR_ID IS NOT NULL
AND AUDIT_TYPE IS NOT NULL
GROUP BY
TICKET_TYPE_END ,
AUDITOR_ID ,
MANUAL_AUDIT_FLAG
</select>