最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis查詢SqlServer慢問題及解決

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

背景

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

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

# 一樣的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í)行計劃,發(fā)現(xiàn)兩條查詢執(zhí)行計劃不一致,查詢慢的預估行數(shù)為1,走了LOOP,循環(huán)次數(shù)過多導致變慢

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

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

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

問題2:#{}和${}導致查詢效率不同

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)過測試,只要條件增加了DBBH和TQBH,就是LIKE語句,查詢就巨慢

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

解決

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

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

以往的認知上,只知道#{}就相當于PreparedStatement,能夠防注入

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

但不知道為啥這個會影響到查詢性能

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

總結(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,會將String參數(shù)用Unicode的編碼方式發(fā)送個服務器,即 JDBCType=NVARCHAR

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

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

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

基于這個思路,我測試了一下

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中手動指定參數(shù)的jdbcType和數(shù)據(jù)庫保持一致,和結(jié)論一樣,可以正常執(zhí)行,不會出現(xiàn)查詢慢的情況。

總結(jié)

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

相關文章

  • Mybatis使用useGeneratedKeys獲取自增主鍵

    Mybatis使用useGeneratedKeys獲取自增主鍵

    這篇文章主要為大家介紹了Mybatis使用useGeneratedKeys獲取自增主鍵示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 解決Nacos成功啟動但是無法訪問 (Connection refused)

    解決Nacos成功啟動但是無法訪問 (Connection refused)

    這篇文章主要介紹了解決Nacos成功啟動但是無法訪問 (Connection refused)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java將微信和支付寶支付的個二維碼合二為一的方法

    Java將微信和支付寶支付的個二維碼合二為一的方法

    這篇文章主要介紹了Java將微信和支付寶支付的個二維碼合二為一的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 教你用Java Swing實現(xiàn)自助取款機系統(tǒng)

    教你用Java Swing實現(xiàn)自助取款機系統(tǒng)

    今天給大家?guī)淼氖顷P于JAVA的相關知識,文章圍繞著如何用Java Swing實現(xiàn)自助取款機系統(tǒng)展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Spring Boot企業(yè)常用的starter示例詳解

    Spring Boot企業(yè)常用的starter示例詳解

    這篇文章主要給大家介紹了關于Spring Boot企業(yè)常用starter的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-12-12
  • Java正則表達式的語法及示例解析

    Java正則表達式的語法及示例解析

    這篇文章主要介紹了Java正則表達式的語法及示例解析,需要的朋友可以參考下
    2017-07-07
  • Elasticsearch外部詞庫文件更新及使用

    Elasticsearch外部詞庫文件更新及使用

    這篇文章主要為大家介紹了Elasticsearch外部詞庫文件更新及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • MyBatis-Plus Sequence主鍵的實現(xiàn)

    MyBatis-Plus Sequence主鍵的實現(xiàn)

    這篇文章主要介紹了MyBatis-Plus Sequence主鍵的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • SpringBoot項目里集成Hibernate的示例

    SpringBoot項目里集成Hibernate的示例

    在Spring Boot項目中,集成Hibernate可以幫助我們更輕松地進行數(shù)據(jù)庫操作,本文將介紹如何在Spring Boot項目中集成Hibernate,并提供相應的示例,感興趣的朋友跟隨小編一起看看吧
    2023-04-04
  • Java開發(fā)實現(xiàn)的Socket雙向通信功能示例

    Java開發(fā)實現(xiàn)的Socket雙向通信功能示例

    這篇文章主要介紹了Java開發(fā)實現(xiàn)的Socket雙向通信功能,結(jié)合實例形式分析了java基于socket實現(xiàn)的服務器端與客戶端雙向通信相關操作技巧,需要的朋友可以參考下
    2018-01-01

最新評論

囊谦县| 寿光市| 丹凤县| 辉南县| 中山市| 皋兰县| 普陀区| 上虞市| 博罗县| 武清区| 房山区| 叶城县| 和林格尔县| 定远县| 沁源县| 库尔勒市| 陇西县| 文水县| 民勤县| 荃湾区| 县级市| 保亭| 贡嘎县| 连江县| 达日县| 米易县| 尚义县| 县级市| 左云县| 和田县| 天长市| 天等县| 宁夏| 临朐县| 汽车| 神农架林区| 隆昌县| 襄城县| 江孜县| 丰原市| 虎林市|