欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis查詢SqlServer慢問題及解決

 更新時(shí)間:2023年08月30日 16:35:31   作者:Ikarosxx  
這篇文章主要介紹了mybatis查詢SqlServer慢問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

背景

項(xiàng)目中用到了mybatis連接SqlServer,但遇到了一些查詢慢的問題

問題1:一樣的sql,換一個(gè)日期執(zhí)行計(jì)劃不同

# 一樣的sql,djsj不同,第一條比第二條快很多
SELECT COUNT
	( 1 ) 
FROM
	e_ld2022 a WITH ( nolock )
	INNER JOIN m_user b ON b.MID = a.dbbh 
WHERE
	a.djsj = '2022-05-18 00:00:00' 
	AND a.TQBH LIKE '01%' 
	AND a.XMBH = 41;
SELECT COUNT
	( 1 ) 
FROM
	e_ld2022 a WITH ( nolock )
	INNER JOIN m_user b ON b.MID = a.dbbh 
WHERE
	a.djsj = '2022-05-19 00:00:00' 
	AND a.TQBH LIKE '01%' 
	AND a.XMBH = 41;

解決

通過MSSM分析執(zhí)行計(jì)劃,發(fā)現(xiàn)兩條查詢執(zhí)行計(jì)劃不一致,查詢慢的預(yù)估行數(shù)為1,走了LOOP,循環(huán)次數(shù)過多導(dǎo)致變慢

故懷疑是沒有更新統(tǒng)計(jì)信息,導(dǎo)致優(yōu)化器優(yōu)化失敗

# 更新統(tǒng)計(jì)信息
UPDATE STATISTICS databse.table;

執(zhí)行更新統(tǒng)計(jì)信息后重新查詢,正常。

問題2:#{}和${}導(dǎo)致查詢效率不同

mybatis中使用到了如下語句

select a.*,x.CBX from e_ld${year} a inner join E_XM x on x.XMBH = a.XMBH
<where>
	<if test="dbbh != null and dbbh !=''">
		AND dbbh LIKE concat(#{dbbh},'%')
	</if>
	<if test="tqbh != null and tqbh !=''">
		AND TQBH LIKE concat(#{tqbh},'%')
	</if>
</where>

經(jīng)過測(cè)試,只要條件增加了DBBH和TQBH,就是LIKE語句,查詢就巨慢

但一樣的SQL拎出來放到MSSM上執(zhí)行,就很快

解決

經(jīng)過偶然測(cè)試,發(fā)現(xiàn)如果使用AND TQBH LIKE '${tqbh}%',就很快

說明問題出現(xiàn)在${}與#{}的區(qū)別上

以往的認(rèn)知上,只知道#{}就相當(dāng)于PreparedStatement,能夠防注入

${}可能出現(xiàn)注入風(fēng)險(xiǎn)

但不知道為啥這個(gè)會(huì)影響到查詢性能

跟了一下源碼,發(fā)現(xiàn)跟sendStringParametersAsUnicode和數(shù)據(jù)庫(kù)字段類型(VARCHAR、NVARCHAR)有關(guān)系

總結(jié)來說就是

sendStringParametersAsUnicode\字段類型VARCHARNVARCHAR
true×
false×

分析

SendStringParametersAsUnicode文檔

SendStringParametersAsUnicode={true | false}.

Determines whether string parameters are sent to the SQL Server databasein Unicode or in the default character encoding of the database.

True means that string parameters are sent to SQL Serverin Unicode.

False means that they are sent in the default encoding, which can improve performance because the serverdoes not need to convert Unicode characters to the default encoding.

You should, however, use default encoding only if theparameter string data that you specify is consistent with the default encoding of the database.The default is true.

如果SendStringParametersAsUnicode=true,會(huì)將String參數(shù)用Unicode的編碼方式發(fā)送個(gè)服務(wù)器,即 JDBCType=NVARCHAR

如果SendStringParametersAsUnicode=false,會(huì)將String參數(shù)用默認(rèn)的方式發(fā)送給服務(wù)器,即 JDBCType=VARCHAR

我們系統(tǒng)里 SendStringParametersAsUnicode=false ,所以指定的 JdbcType=VARCHAR

但是數(shù)據(jù)庫(kù)字段是NVARCHAR,和我們指定的不一致,所以會(huì)發(fā)生轉(zhuǎn)換性能損耗,導(dǎo)致時(shí)間查詢慢

基于這個(gè)思路,我測(cè)試了一下

select a.*,x.CBX from e_ld${year} a inner join E_XM x on x.XMBH = a.XMBH
<where>
	<if test="dbbh != null and dbbh !=''">
		AND dbbh LIKE concat(#{dbbh, jdbcType=NVARCHAR},'%')
	</if>
	<if test="tqbh != null and tqbh !=''">
		AND TQBH LIKE concat(#{tqbh, jdbcType=NVARCHAR},'%')
	</if>
</where>

在mybatis xml中手動(dòng)指定參數(shù)的jdbcType和數(shù)據(jù)庫(kù)保持一致,和結(jié)論一樣,可以正常執(zhí)行,不會(huì)出現(xiàn)查詢慢的情況。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot自動(dòng)重啟的簡(jiǎn)單方法

    springboot自動(dòng)重啟的簡(jiǎn)單方法

    Springboot提供了熱部署的方式,當(dāng)發(fā)現(xiàn)任何類發(fā)生了改變,馬上通過JVM類加載的方式,加載最新的類到虛擬機(jī)中。這篇文章主要介紹了springboot自動(dòng)重啟的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-04-04
  • Sentinel熱點(diǎn)規(guī)則示例詳解分析

    Sentinel熱點(diǎn)規(guī)則示例詳解分析

    這篇文章主要介紹了何為熱點(diǎn)?熱點(diǎn)即經(jīng)常訪問的數(shù)據(jù)。很多時(shí)候我們希望統(tǒng)計(jì)某個(gè)熱點(diǎn)數(shù)據(jù)中訪問頻次最高的 Top K 數(shù)據(jù),并對(duì)其訪問進(jìn)行限制
    2021-09-09
  • 針對(duì)Dubbo接口Mock的解決方案詳解

    針對(duì)Dubbo接口Mock的解決方案詳解

    這篇文章主要為大家介紹了針對(duì)Dubbo接口Mock的解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java創(chuàng)建文件且寫入內(nèi)容的方法

    Java創(chuàng)建文件且寫入內(nèi)容的方法

    這篇文章主要介紹了Java創(chuàng)建文件且寫入內(nèi)容的方法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • Java使用JDBC驅(qū)動(dòng)連接MySQL數(shù)據(jù)庫(kù)

    Java使用JDBC驅(qū)動(dòng)連接MySQL數(shù)據(jù)庫(kù)

    這篇文章主要為大家詳細(xì)介紹了Java使用JDBC驅(qū)動(dòng)連接MySQL數(shù)據(jù)庫(kù)的具體步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • SpringMVC配置多個(gè)properties文件之通配符解析

    SpringMVC配置多個(gè)properties文件之通配符解析

    這篇文章主要介紹了SpringMVC配置多個(gè)properties文件之通配符解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring BPP中如何優(yōu)雅的創(chuàng)建動(dòng)態(tài)代理Bean詳解

    Spring BPP中如何優(yōu)雅的創(chuàng)建動(dòng)態(tài)代理Bean詳解

    這篇文章主要給大家介紹了關(guān)于Spring BPP中如何優(yōu)雅的創(chuàng)建動(dòng)態(tài)代理Bean的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法

    Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法

    本文主要介紹了Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • SpringBoot集成mybatis實(shí)例

    SpringBoot集成mybatis實(shí)例

    本篇文章主要介紹了SpringBoot集成mybatis實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Spring動(dòng)態(tài)管理定時(shí)任務(wù)之ThreadPoolTaskScheduler解讀

    Spring動(dòng)態(tài)管理定時(shí)任務(wù)之ThreadPoolTaskScheduler解讀

    這篇文章主要介紹了Spring動(dòng)態(tài)管理定時(shí)任務(wù)之ThreadPoolTaskScheduler解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論