亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

記一次苦逼的Sql查詢優化

2024-07-21 02:46:27
字體:
來源:轉載
供稿:網友
記一次苦逼的Sql查詢優化

最近在維護公司項目時,需要加載某頁面,總共加載也就4000多條數據,竟然需要35秒鐘,要是數據增長到40000條,我估計好幾分鐘都搞不定。臥槽,要我是用戶的話估計受不了,趁閑著沒事,就想把它優化一下,走你。

先把查詢貼上:

       select Pub_AidBasicInformation.AidBasicInfoId,       Pub_AidBasicInformation.UserName,       Pub_AidBasicInformation.District,       Pub_AidBasicInformation.Street,       Pub_AidBasicInformation.Community,       Pub_AidBasicInformation.DisCard,       Pub_application.CreateOn AS AppCreateOn,       Pub_User.UserName as DepartmentUserName,        Pub_Consult1.ConsultId,       Pub_Consult1.CaseId,       Clinicaltb.Clinical,AidNametb.AidName,       Pub_Application.IsUseTraining,       Pub_Application.ApplicationId,       tab.numFROM   Pub_Consult1INNER JOIN Pub_Application ON Pub_Consult1.ApplicationId = Pub_Application.ApplicationIdINNER JOIN Pub_AidBasicInformation ON Pub_Application.AidBasicInfoId = Pub_AidBasicInformation.AidBasicInfoId                                                           INNER JOIN(select ConsultId,dbo.f_GetClinical(ConsultId) as Clinical            from Pub_Consult1) Clinicaltb on Clinicaltb.ConsultId=Pub_Consult1.ConsultIdleft join (select distinct ApplicationId, sum(TraniningNumber) as num from dbo.Review_Aid_UseTraining_Record  where  AidReferralId is null  group by  ApplicationId) tab on tab.ApplicationId=Pub_Consult1.ApplicationIdINNER JOIN(select ConsultId,dbo.f_GetAidNamebyConsult1(ConsultId) as AidName  from Pub_Consult1) AidNametb on AidNametb.ConsultId=Pub_Consult1.ConsultId                              LEFT OUTER JOIN Pub_User ON Pub_Application.ReviewUserId = Pub_User.UserId     WHERE Pub_Consult1.Directory = 0     order by Pub_Application.CreateOn desc
View Code

執行后有圖有真相:

這么慢,沒辦法就去看看查詢計劃是怎么樣:

這是該sql查詢里面執行三個函數時生成查詢計劃的截圖,一看就知道,執行時開銷比較大,而且都是花費在聚集索引掃描上,把鼠標放到聚集索引掃描的方塊上面,依次看到如下詳細計劃:

從這幾張圖里,可以看到查詢I/O開銷,運算符開銷,估計行數,以及操作的對象和查詢條件,這些都為優化查詢提供了有利證據。第1,3張圖IO開銷比較大,第2張圖估計行數比較大,再根據其它信息,首先想到的應該是去建立索引,不行的話再去改查詢。

先看看數據庫引擎優化顧問能給我們提供什么優化信息,有時候它能夠幫我們提供有效的信息,比如創建統計,索引,分區什么的。

先打開SQL Server PRofiler 把剛剛執行的查詢另存為跟蹤(.trc)文件,再打開數據庫引擎優化顧問,做如下圖操作

最后生成的建議報告如下:

在這里可以單擊查看一些建議,分區,創建索引,根據提示創建了如下索引:

CREATE NONCLUSTERED INDEX index1 ON [dbo].[Pub_AidBasicInformation](    [AidBasicInfoId] ASC)CREATE NONCLUSTERED INDEX index1 ON [dbo].[Pub_Application](    [ApplicationId] ASC,[ReviewUserId] ASC,[AidBasicInfoId] ASC,[CreateOn] ASC)CREATE NONCLUSTERED INDEX index1 ON [dbo].[Pub_Consult1](    [Directory] ASC,[ApplicationId] ASC) CREATE NONCLUSTERED INDEX idnex1 ON [dbo].[Review_Aid_UseTraining_Record](    [AidReferralId] ASC,[ApplicationId] ASC)
View Code

索引創建后,再次執行查詢,原以為可提高效率,沒想到我勒個去,還是要30幾秒,幾乎沒什么改善,優化引擎顧問有時候也會失靈,在這里只是給大家演示有這種解決方案去解決問題,有時候還是靠譜的,只是這次不靠譜。沒辦法,只有打開函數仔細瞅瞅,再結合上面的查詢計劃詳細圖,刪除先前創建的索引,然后創建了如下索引:

CREATE NONCLUSTERED INDEX index1 ON dbo.Report_AdapterAssessment_Aid(    AdapterAssessmentId ASC, ProductDirAId  ASC)CREATE NONCLUSTERED INDEX index1 ON dbo.Report_AdapterAssessment(    ConsultId ASC)
View Code

再次執行查詢

好了,只需3.5秒,差不多提高10倍速度,看來這次是湊效了哈。

再來看看查詢計劃是否有改變,上張圖來說明下問題:

從上圖當中我們可以看到,索引掃描不見了,只有索引查找,聚集索引查找,鍵查找,而且運算符開銷,I/O開銷都降低了很多。索引掃描(Index Scan),聚集索引掃描(Clustered Index Scan)跟表掃描(Table Scan)差不多,基本上是逐行去掃描表記錄,速度很慢,而索引查找(Index Seek),聚集索引查找,鍵查找都相當的快。優化查詢的目的就是盡量把那些帶有XXXX掃描的去掉,換成XXXX查找。

這樣夠了嗎?但是回頭又想想,4000多條數據得3.5秒鐘,還是有點慢了,應該還能再快點,所以決定再去修改查詢。看看查詢,能優化的也只有那個三個函數了。

為了看函數執行效果先刪除索引,看看查詢中函數f_GetAidNamebyConsult1要干的事情,截取查詢中與該函數有關的子查詢:

select Pub_Consult1.ConsultId,AidName from (select ConsultId,dbo.f_GetAidNamebyConsult1(ConsultId) as AidNamefrom Pub_Consult1) AidNametb inner join Pub_Consult1on AidNametb.ConsultId=Pub_Consult1.ConsultId 

得到下圖的結果:

沒想到就這么點數據竟然要46秒,看來這個函數真的是罪魁禍首。

該函數的具體代碼就不貼出來了,而且該函數里面還欠套的另外一個函數,本身函數執行起來就慢,更何況還函數里子查詢還包含函數。其實根據幾相關聯的表去查詢幾個字段,并且把一個字段的值合并到同一行,這樣沒必要用函數或存儲過程,用子查詢再加sql for xml path就行了,把該函數改成如下查詢:

with cte1 as(    select A.AdapterAssessmentId,case when B.AidName is null then A .AidName else B.AidName end AidName    from Report_AdapterAssessment_Aid as A left join Pub_ProductDir as B    on A.ProductDirAId=B.ProductDirAId), cte2 as(    --根據AdapterAssessmentId分組并合并AidName字段值    select AdapterAssessmentId,(select AidName+',' from cte1                              where AdapterAssessmentId= tb.AdapterAssessmentId                              for xml path(''))as AidName    from cte1 as tb    group by AdapterAssessmentId),cte3 as(    select ConsultId,LEFT(AidName,LEN(AidName)-1) as AidName    from    (       select Pub_Consult1.ConsultId,cte2.AidName from Pub_Consult1,Report_AdapterAssessment,cte2       where Pub_Consult1.ConsultId=Report_AdapterAssessment.ConsultId       and Report_AdapterAssessment.AdapterAssessmentId=cte2.AdapterAssessmentId       and  Report_AdapterAssessment.AssessTuiJian is null    ) as tb)
View Code

這樣查詢出來的結果在沒有索引的情況下不到1秒鐘就行了。再把主查詢寫了:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久久久| 国产精品h在线观看| 久久精品国产一区二区电影| 亚洲成人999| 亚洲人线精品午夜| 欧美在线播放视频| 亚洲国产美女精品久久久久∴| 91久久在线视频| 欧美乱妇高清无乱码| 国产精品a久久久久久| 九九热这里只有精品6| 91精品综合久久久久久五月天| 久久久噜噜噜久久| 中文字幕亚洲一区| 日韩欧美一区二区三区久久| 欧美电影第一页| 粉嫩老牛aⅴ一区二区三区| 国产福利视频一区| 亚洲男人天堂古典| 超碰精品一区二区三区乱码| 亚洲最大福利视频网| 国产一区欧美二区三区| 久久久久久久国产| 97精品欧美一区二区三区| 91免费视频国产| 91性高湖久久久久久久久_久久99| 久久精品视频免费播放| 久久综合伊人77777| 欧美一级视频免费在线观看| 成人有码在线播放| 欧美成在线视频| 久久亚洲一区二区三区四区五区高| 久久久欧美精品| 国产一区二区三区四区福利| 国产国语刺激对白av不卡| 在线视频中文亚洲| 日韩欧美中文字幕在线播放| 日韩成人在线网站| 日韩av理论片| 欧美日韩国产999| 国产欧美日韩免费看aⅴ视频| 日韩精品在线电影| 日韩免费观看av| 91精品国产高清久久久久久久久| 亚洲网在线观看| 91午夜在线播放| 久久99精品国产99久久6尤物| 久久香蕉频线观| 精品久久久久久久大神国产| 97精品久久久| 国产一区二区三区中文| 一区二区三区日韩在线| 久久久久久成人| 日韩激情片免费| 欧美视频一区二区三区…| 日韩av影视在线| 中文字幕欧美精品在线| 国产成人综合精品在线| 精品亚洲夜色av98在线观看| 久久久久久久激情视频| 91精品免费视频| 热久久免费视频精品| 午夜精品久久久久久久99热| 国模私拍视频一区| 456亚洲影院| 国产精品igao视频| 成人啪啪免费看| 隔壁老王国产在线精品| 黑人狂躁日本妞一区二区三区| 国产精品第8页| 欧美黄色片在线观看| 色先锋资源久久综合5566| 日韩影视在线观看| 亚洲永久在线观看| 亚洲爱爱爱爱爱| 国产精品一区二区电影| 国产精品视频白浆免费视频| 久久99久久99精品免观看粉嫩| 亚洲人成在线播放| 91香蕉嫩草神马影院在线观看| 国产一区视频在线播放| 成人国产精品久久久久久亚洲| 亚洲最大的成人网| 国产人妖伪娘一区91| 久久久影视精品| 国产精品入口尤物| 久久久久九九九九| 国产99视频在线观看| 中文字幕在线日韩| 成人精品视频久久久久| 国产精品美女www爽爽爽视频| 亚洲欧美日韩图片| 97精品久久久中文字幕免费| 国产亚洲精品久久久久动| 欧美日韩国产91| 国产精品天天狠天天看| 这里只有精品视频| 日韩精品视频在线观看网址| 91在线观看免费高清完整版在线观看| 日本免费久久高清视频| 久久久久久国产| 欧美高清视频在线观看| 国产欧美亚洲精品| 自拍偷拍亚洲一区| 亚洲欧洲免费视频| 国产一区二区三区高清在线观看| 亚洲性av网站| 91av在线播放视频| xxxxxxxxx欧美| 国产日韩欧美电影在线观看| 色播久久人人爽人人爽人人片视av| 欧美电影在线观看高清| 欧美国产极速在线| 欧美电影免费在线观看| 久99久在线视频| 韩国国内大量揄拍精品视频| 日本精品视频网站| 久久久国产精品亚洲一区| 日韩在线视频免费观看| 国产精品美女久久久久av超清| 国产欧美一区二区三区久久| 色综久久综合桃花网| 精品国产欧美成人夜夜嗨| 中文字幕欧美在线| 午夜精品久久久久久久99热| 欧美极品美女视频网站在线观看免费| 久久综合免费视频影院| 91精品国产777在线观看| 成人欧美一区二区三区在线湿哒哒| 亚洲图片在区色| 久久久久国产视频| 亚洲aⅴ日韩av电影在线观看| 中文字幕日韩精品在线观看| 91九色综合久久| 亚洲欧美一区二区激情| 国产精品www色诱视频| 国产精品视频自在线| 懂色aⅴ精品一区二区三区蜜月| 欧美亚洲在线播放| 亚洲成av人乱码色午夜| 国产99久久精品一区二区 夜夜躁日日躁| 九九热r在线视频精品| 日韩美女福利视频| 成人性生交大片免费看小说| 亚洲男人的天堂在线播放| 国产欧洲精品视频| 欧美激情第一页xxx| 国产成人精品免高潮在线观看| 91精品国产网站| 欧美在线一级视频| 九色91av视频| 国产精品91免费在线| 日本在线精品视频| 91老司机在线| 日韩免费电影在线观看| 久久精品欧美视频| 久久6精品影院| 国产精品一区二区三区久久久| 日韩美女免费视频| 精品一区电影国产| 亚洲欧洲激情在线| 国产欧美精品在线| 亚洲综合成人婷婷小说| 4438全国亚洲精品在线观看视频|