SQL 語句優化--IN語句優化案例

為什么80%的碼農都做不了架構師?>>> ??hot3.png

今天客戶系統升級,通過DMVs性能分析查了一下,升級后發現一個語句執行時間比較長,執行語句要好幾秒鐘,調出語句如下:

select?distinct?field003?from?ufi2j0n11179717502375?where?
field003?not?in?('','40288135120d660501120de2f8870140','40288135120d660501120de4b9ee014b',
'40288135120d660501120de9c3ba016c','40288135120d660501120df0460c01b2','40288135120d660501120df1dc2d01d3')?and???requestid?in(select?requestid?from?ufi8s6u81179717475734?where?field001?in?(select?requestid?from? uft3a6h61176948132312?where?field066?is?not??null?and??field197?between?convert(datetime,?'2008-08-16')?and?convert(datetime,'2008-09-15'))?)

?? 后來看了一下,這幾表的數據

--?表 dbo.uft3a6h61176948132312?:?988行
-- 表:dbo.ufi2j0n11179717502375??:713行
-- 表:?dbo.ufi8s6u81179717475734?:??273行

? ?發現這三張表都沒有超過1千行數據,建立索引意義不大,為何如此慢,看看執行計劃:

??

? 分析:發現是表dbo.uft3a6h61176948132312?訪問開銷最大,但表中數據不到一千行。執行看看結果:

(5?行受影響)
表?'uft3a6h61176948132312'。掃描計數?1,邏輯讀取?27161?次,物理讀取?0?次,預讀?0?次,lob?邏輯讀取?0?次,lob?物理讀取?0?次,lob?預讀?0?次。
表?'Worktable'。掃描計數?0,邏輯讀取?0?次,物理讀取?0?次,預讀?0?次,lob?邏輯讀取?0?次,lob?物理讀取?0?次,lob?預讀?0?次。
表?'ufi8s6u81179717475734'。掃描計數?1,邏輯讀取?37?次,物理讀取?0?次,預讀?0?次,lob?邏輯讀取?0?次,lob?物理讀取?0?次,lob?預讀?0?次。
表?'ufi2j0n11179717502375'。掃描計數?1,邏輯讀取?46?次,物理讀取?0?次,預讀?0?次,lob?邏輯讀取?0?次,lob?物理讀取?0?次,lob?預讀?0?次。

??? 這里發現表uft3a6h61176948132312的訪問有近3萬次IO。?一開始以為是in的緣故,將in換成exists結果也是一樣,這時考慮用inner join來重新寫sql語句,語句如下:

select?distinct?a.field003?from?ufi2j0n11179717502375??a
inner?join?ufi8s6u81179717475734?b?on?a.requestid=b.requestid
inner?join??uft3a6h61176948132312?c?on?b.field001=c.requestid
where?a.field003?not?in?('','40288135120d660501120de2f8870140','40288135120d660501120de4b9ee014b','40288135120d660501120de9c3ba016c','40288135120d660501120df0460c01b2','40288135120d660501120df1dc2d01d3')?and???c.field066?is?not??null?and??c.field197?between?
convert(datetime,?'2008-08-16')?and?convert(datetime,'2008-09-15')

? 查看執行計劃:

? 分析:這時發現執行計劃發生了變化,最外層的表變成了dbo.ufi2j0n11179717502375,執行結果如下:

(5?行受影響)
表?'Worktable'。掃描計數?0,邏輯讀取?0?次,物理讀取?0?次,預讀?0?次,lob?邏輯讀取?0?次,lob?物理讀取?0?次,lob?預讀?0?次。
表?'ufi2j0n11179717502375'。掃描計數?1,邏輯讀取?46?次,物理讀取?0?次,預讀?0?次,lob?邏輯讀取?0?次,lob?物理讀取?0?次,lob?預讀?0?次。
表?'ufi8s6u81179717475734'。掃描計數?1,邏輯讀取?37?次,物理讀取?0?次,預讀?0?次,lob?邏輯讀取?0?次,lob?物理讀取?0?次,lob?預讀?0?次。
表?'uft3a6h61176948132312'。掃描計數?1,邏輯讀取?421?次,物理讀取?0?次,預讀?0?次,lob?邏輯讀取?0?次,lob?物理讀取?0?次,lob?預讀?0?次。

?? 這時發現整個IO次數比先前少了很多。

? 總結:

????? 根據這兩個執行計劃分析,sql server 2005優化器對于in語句沒有正確選擇聯結算法,錯誤的采用了采用了”嵌套循環算法“。

????? 根據嵌套循環算法IO次數:421*(其他兩個表的關聯匹配行數)≈27163次 (訪問表“uft3a6h61176948132312”IO次數),而這時由于返回的行數比較多,又沒有建立索引,這時最佳的算法是使用“hash聯結算法

轉載于:https://my.oschina.net/ldm95/blog/745893

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397684.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Activity跳轉

本例中MainActivity為:FirstActivity.java FirstActivity如下: package com.wyl.intentmultiactivitytest;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Vie…

Java課程設計---項目數據庫設計(含實體類)

1、數據庫分析設計 將數據庫命名為:db_student 分析系統中各角色之間的關系 2、表設計 (1)新建表tb_student(學生表) (2)新建表tb_admin(管理員表) (3&#x…

java)_Java NIO系列教程(一) Java NIO 概述

原文鏈接 作者:Jakob Jenkov 譯者:airu 校對:丁一Java NIO 由以下幾個核心部分組成:ChannelsBuffersSelectors雖然Java NIO 中除此之外還有很多類和組件,但在我看來,Channel,Buffer…

本地讀取服務器Xml文件及本地讀本地的xml

updateUrl"ServerUrl"(服務器路徑) WebClient wc new WebClient(); Stream stream wc.OpenRead(updateUrl); XmlDocument xmlDoc new XmlDocument(); xmlDoc.Load(stream); XmlNode list xmlDoc.SelectSingleNode("Update"); foreach (XmlNode node in…

Context.getExternalFilesDir()和Context.getExternalCacheDir()方法

2019獨角獸企業重金招聘Python工程師標準>>> Context.getExternalCacheDir()方法可以獲取到 SDCard/Android/data/你的應用包名/cache/目錄,一般存放臨時緩存數據如果使用上面的方法,當你的應用在被用戶卸載后,SDCard/Android/dat…

java 靜態代碼塊_JAVA靜態代碼塊

今天遇到下面的代碼,感覺很奇怪,特意記錄下:代碼如下:public class Test {private static List objs new ArrayList();static {objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT));objs.add(new Test(Test.S_NAME,Test.NAME,…

context詳解

1、Context概念: Context,相信不管是第一天開發Android,還是開發Android的各種老鳥,對于Context的使用一定不陌生~~你在加載資源、啟動一個新的Activity、獲取系統服務、獲取內部文件(夾)路徑、創建View操作…

Unity Camera的兩種模式

http://www.cnblogs.com/zhaoqingqing/p/3302484.html

mysql之group_concat函數

mysql之group_concat函數 在介紹GROUP_CONCAT之前,我們先來看看concat()函數和concat_ws()函數。 先準備一個測試數據庫: mysql> select * from scores; --------------------- | id | name | score | --------------------- | 1 | zhangsan | 1…

java 圖片批量上傳_java實現批量上傳圖片,還要保證每個圖片的順序號,疑問求教!...

rt我要一次性同時上傳n張照片,并且每張照片的順序號還不一樣,第一張的serialno是1,第二張是2。。一開始我做單張圖片上傳,代碼如下RequestMapping("/picUpLoad")ResponseBodypublic Map picUpLoad(MultipartFile file, …

linux 用戶創建、管理、權限分配

(1)su與sudo su:通過su可以在用戶之間切換,如果超級權限用戶root向普通或虛擬用戶切換不需要密碼,什么是權力?這就是!而普通用戶切換到其它任何用戶都需要密碼驗證; sudo: sudo扮演的角色注定了…

WebApi路由

路由分為兩種模式:模板路由和特性路由。 模板路由: 模板路由是ASP.NET Web API默認提供的路由。模板路由使用前需要定義路由模板。如下面默認的路由模板: 默認路由的URL格式是api/{controller}/{id}。api代表在資源前面要帶上api目錄&#xf…

HW--漂亮度2(測試通過)

總結:幾個函數的使用 (1) int numInteger.parseInt(str[0]); //將第一個字符串轉成整形數,表示名字個數 (2) String string1str[i].toLowerCase(); //變小寫都 (3) char ch[]strin…

java設計模式 組合_JAVA 設計模式 組合模式

用途組合模式 (Component)將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有唯一性。組合模式是一種結構型模式。結構圖-組合模式結構圖Component: 組合中的對象聲明接口,在適當的情況下,實現所有類共…

項目總結SpringMVC相關

流程文字概述1、用戶發送請求至前端控制器DispatcherServlet2、DispatcherServlet收到請求調用HandlerMapping處理器映射器。3、處理器映射器找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。4、DispatcherServlet調用Ha…

SpringBoot登錄登出切面開發

閱讀本文約“2.5分鐘” 本文開發環境是SpringBoot2.X版本。 對于系統而言(這里多指管理系統或部分具備登錄登出功能的系統),登錄登出是一個類權限驗證的過程,現在一般是以token進行校驗,即用戶輸入登錄信息&#xff0c…

4、Cocos2dx 3.0三,找一個小游戲開發Hello World 分析

尊重開發人員的勞動成果。轉載的時候請務必注明出處:http://blog.csdn.net/haomengzhu/article/details/27186557Hello World 分析打開新建的"findmistress"項目,能夠看到項目文件是由多個代碼文件及目錄組成的。當中 Hello World 的代碼文件直…

spring --aop(日志記錄)在工程中實際使用

2019獨角獸企業重金招聘Python工程師標準>>> ###1.日志切面 package com.readygo.zbhealth.common;import java.util.Arrays; import java.util.List;import org.aspectj.lang.ProceedingJoinPoint;public class LoggingAspect {public Object Around(ProceedingJoi…

java 多表分頁_多表單獨查詢組合結果的自定義分頁(java代碼)

多表單獨查詢組合結果的自定義分頁實現(java代碼)一、業務需求:遇到一個業務,需要多個表進行分頁查詢,使用union聯合查詢時,速度極其緩慢,即使查詢的字段添加了索引,union查詢好像不走索引,因此…

Neutorn LBaaS 原理

Load Balance as a Service(LBaaS)是 Neutron 提供的一項高級網絡服務。LBaaS 允許租戶在自己的網絡中創建和管理 load balancer。 load balancer 可以說是分布式系統中比較基礎的組件。 它接收前端發來的請求,然后將請求按照某種均衡策略轉發…