一次快速改寫 SQL Server 高效查詢的範例

Posted kingjaja

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一次快速改寫 SQL Server 高效查詢的範例相关的知识,希望对你有一定的参考价值。

最近線上系統突然出現匯出資料超過 10 筆時,查詢逾時的狀況,在仔細查找之後。

發現了問題原因,透過應用端與數據端兩邊同時調整,將查詢的效率提昇了約數百倍以上

首先,原本應用端的商務邏輯為每一分頁筆數固定為10筆,所以使用者最多可以匯出 10 筆資料

而且原本的商務邏輯是寫成這樣的

技术分享图片

這段語法在 SQL Server 執行時,會轉換成以下的範例語法

(這裡 A 表 與 B表 為 1:N 關聯 )

SELECT LawNo,LCNo

FROM A INNER JOIN B

WHERE 1=1 AND (LawNo+LCNo) IN (‘A1’,’A2’….’A10’)

在IN條件少的情況下,即使效率不好,還是可以進行資料匯出的

這次的問題是因為應用商務邏輯修改導致,從原本使用者最多只能匯出 10 筆資料

改為最多能匯出500筆資料.

從上述的範例可知 WHERE 條件式的 IN 參數就達 500 個

此外條件式欄位也因用了函數而走 Index Scan

在多個參數下,搜索時間自然拉長

來看看修改前的樣子

技术分享图片技术分享图片

在上圖中測試語句只放了10個 IN 條件參數,可以見到執行效率整體不是挺好的

 

接下來看看我們如何做應用與數據端的調整

首先將應用端原本的查詢參數,改為 Table Valued Parameter 形式

並且將原本的 IN 查找語法,修改為與Table Valued Parameter 做  INNER JOIN

技术分享图片

接下來在數據端需要建立一個對應的自訂 Table Type

技术分享图片

最後來看看修改後的結果

技术分享图片

技术分享图片

可以看到整個修改完後,Logical read 數下降了快4萬之多,執行計畫也移掉了 Parallelism 執行

是不是感覺很簡單呢?這個用法不只能用在查找語句的改寫,也可以試著用在大量 Insert 緩慢的情境上 

各位小夥伴,如果應用端突然出現這種情況的話,可以考慮看看與開發溝通,改用 TVP 進行改寫喲 技术分享图片

謝謝大家

以上是关于一次快速改寫 SQL Server 高效查詢的範例的主要内容,如果未能解决你的问题,请参考以下文章

监控目前所有连接SQL SERVER的用户信息

SQLAlchemy 一对多

[DE2i-150] 重建PCIe_Fundmental範例說明

鸟哥私房菜——正则基本表示法

問題排查:行動裝置網頁前端 UI 設計

PL/SQL Developer查詢已經執行過的SQL語句記錄 Ctrl+E