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

MyBatis自動生成Where語句

 更新時間:2016年08月11日 09:41:08   作者:萬劍齊發(fā)  
這篇文章主要介紹了MyBatis自動生成Where語句的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

最近監(jiān)控到類似這樣一個慢查詢:

select delete_flag,delete_time
from D_OrderInfo 
   WHERE ( OrderId is not null and
          OrderId = N'xxxx') 

D_OrderInfo表上有一個OrderId的索引,但OrderId字段是Varchar類型。

由于開發(fā)框架MyBatis自動生成Where條件不會指定參數(shù)類型,字符串類型的參數(shù)到了SQLServer里就自動成了NVARCHAR(4000)類型了,坑人的是,不指定參數(shù)類型也就罷了,還自動加了個OrderId Is NOT NULL這樣一個非SARG的條件,執(zhí)行計劃成了這樣:



---------------------------------------------------------------------------------------------
如果沒有OrderId IS NOT NULL這個條件,執(zhí)行計劃會是這樣的:



由于參數(shù)類型Nvarchar比索引字段類型varchar優(yōu)先級要高,不能直接轉(zhuǎn)換,但SQLServer優(yōu)化器最終還是將他轉(zhuǎn)成了一個范圍值,最終的等號查詢也變成了類似一個小范圍查詢。

可以從Index Seek這一步的詳細信息可以看出:



------------------------------------------------------------------------

如果參數(shù)類型匹配,那么執(zhí)行計劃會是想象中的那樣(雖然沒有包含到,還是有Key Lookup):



當(dāng)然,有點小小強迫癥的我最終希望的寫法是這樣的:

select delete_flag,delete_time
from D_OrderInfo 
   WHERE OrderId = 'xxxx'

執(zhí)行計劃當(dāng)然也會是這樣的:

只是,只是不知道最終開發(fā)大神能改成什么樣......

開發(fā)大神的解決方案:連接字符串中配置:

sendStringParametersAsUnicode=false

后記:

默認情況下,Java 中的字符數(shù)據(jù)作為 Unicode 進行處理;Java String 對象表示 Unicode 字符數(shù)據(jù)。在 JDBC 驅(qū)動程序中,唯一可以不遵守此規(guī)則的是 ASCII 流 getter 和 setter 方法,這屬于比較特殊的情況,因為這些方法使用的字節(jié)流帶有單個已知代碼頁 (ASCII) 的隱式假定。

此外,JDBC 驅(qū)動程序提供了 sendStringParametersAsUnicode 連接字符串屬性。此屬性可用于指定作為 ASCII 而不是 Unicode 來發(fā)送的字符數(shù)據(jù)的預(yù)定義參數(shù)。

作為性能方面的一項增強功能,可以通過設(shè)置 sendStringParametersAsUnicode 連接字符串屬性將 String 參數(shù)以非 Unicode 格式傳遞到 SQL Server。sendStringParametersAsUnicode 的默認設(shè)置為“true”,這意味著 String 參數(shù)將作為 Unicode 進行發(fā)送。

如果 sendStringParametersAsUnicode 設(shè)置為“false”,則連接上的所有 String 參數(shù)將使用數(shù)據(jù)庫默認的排序規(guī)則發(fā)送到服務(wù)器。

參考:

http://d.hatena.ne.jp/gnarl/20110706/1309945379

https://technet.microsoft.com/zh-cn/library/ms378857(SQL.90).aspx

https://technet.microsoft.com/zh-cn/library/ms378988(v=sql.90).aspx

相關(guān)文章

  • JavaScript的基本類型值-String類型

    JavaScript的基本類型值-String類型

    String類型用于表示由零或多個16位Unicode字符組成的字符序列,即字符串。在JavaScript中沒有單個的字符型,都是字符串。這篇文章主要介紹了JavaScript的基本類型值String類型,需要的朋友可以參考下
    2017-02-02
  • 淺析Java常用API(Scanner,Random)匿名對象

    淺析Java常用API(Scanner,Random)匿名對象

    這篇文章主要介紹了Java常用API(Scanner,Random)匿名對象,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Spring入門實戰(zhàn)之Profile詳解

    Spring入門實戰(zhàn)之Profile詳解

    什么是spring profile?簡單講profile就是一組配置,不同profile提供不同組合的配置,程序運行時可以選擇使用哪些profile來適應(yīng)環(huán)境。下面這篇文章主要介紹了Spring中Profile實戰(zhàn)的相關(guān)資料,需要的朋友可以參考借鑒。
    2017-02-02
  • springboot中的starter使用解析

    springboot中的starter使用解析

    這篇文章主要介紹了springboot中的starter使用解析,引入了starter依賴之后,基礎(chǔ)組件就可以像在spring的bean一樣在項目中使用,那其實只要找到在哪里加載了這些bean就明白了,需要的朋友可以參考下
    2023-10-10
  • Jmeter設(shè)置全局變量token過程圖解

    Jmeter設(shè)置全局變量token過程圖解

    這篇文章主要介紹了Jmeter設(shè)置全局變量token過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 簡單了解JavaBean作用及常用操作

    簡單了解JavaBean作用及常用操作

    這篇文章主要介紹了簡單了解JavaBean作用及常用操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Spring Cloud超詳細i講解Feign自定義配置與使用

    Spring Cloud超詳細i講解Feign自定義配置與使用

    這篇文章主要介紹了SpringCloud Feign自定義配置與使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 關(guān)于java方法區(qū)詳解

    關(guān)于java方法區(qū)詳解

    這篇文章主要介紹了關(guān)于java方法區(qū)的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • java自帶的MessageDigest實現(xiàn)文本的md5加密算法

    java自帶的MessageDigest實現(xiàn)文本的md5加密算法

    這篇文章主要介紹了java自帶的MessageDigest實現(xiàn)文本的md5加密算法,需要的朋友可以參考下
    2015-12-12
  • 老生常談Java動態(tài)編譯(必看篇)

    老生常談Java動態(tài)編譯(必看篇)

    下面小編就為大家?guī)硪黄仙U凧ava動態(tài)編譯(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論