国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

記一次苦逼的SQL查詢優化

2019-11-17 02:12:33
字體:
來源:轉載
供稿:網友
記一次苦逼的SQL查詢優化

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

Sql代碼
  1. selectPub_AidBasicInformation.AidBasicInfoId,
  2. Pub_AidBasicInformation.UserName,
  3. Pub_AidBasicInformation.District,
  4. Pub_AidBasicInformation.Street,
  5. Pub_AidBasicInformation.Community,
  6. Pub_AidBasicInformation.DisCard,
  7. Pub_application.CreateOnASAppCreateOn,
  8. Pub_User.UserNameasDepartmentUserName,
  9. Pub_Consult1.ConsultId,
  10. Pub_Consult1.CaseId,
  11. Clinicaltb.Clinical,AidNametb.AidName,
  12. Pub_Application.IsUseTraining,
  13. Pub_Application.ApplicationId,
  14. tab.num
  15. FROMPub_Consult1
  16. INNERJOINPub_ApplicationONPub_Consult1.ApplicationId=Pub_Application.ApplicationId
  17. INNERJOINPub_AidBasicInformationONPub_Application.AidBasicInfoId=Pub_AidBasicInformation.AidBasicInfoId
  18. INNERJOIN(selectConsultId,dbo.f_GetClinical(ConsultId)asClinical
  19. fromPub_Consult1)ClinicaltbonClinicaltb.ConsultId=Pub_Consult1.ConsultId
  20. leftjoin(selectdistinctApplicationId,sum(TraniningNumber)asnumfromdbo.Review_Aid_UseTraining_RecordwhereAidReferralIdisnullgroupbyApplicationId)tabontab.ApplicationId=Pub_Consult1.ApplicationId
  21. INNERJOIN(selectConsultId,dbo.f_GetAidNamebyConsult1(ConsultId)asAidNamefromPub_Consult1)AidNametbonAidNametb.ConsultId=Pub_Consult1.ConsultId
  22. LEFTOUTERJOINPub_UserONPub_Application.ReviewUserId=Pub_User.UserId
  23. WHEREPub_Consult1.Directory=0
  24. orderbyPub_Application.CreateOndesc

執行后有圖有真相:

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

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

從這幾張圖里,可以看到查詢I/O開銷,運算符開銷,估計行數,以及操作的對象和查詢條件,這些都為優化查詢提供了有利證據。第1,3張圖IO開銷比較大,第2張圖估計行數比較大,再根據其它信息,首先想到的應該是去建立索引,不行的話再去改查詢。先看看數據庫引擎優化顧問能給我們提供什么優化信息,有時候它能夠幫我們提供有效的信息,比如創建統計,索引,分區什么的。先打開SQL Server PRofiler 把剛剛執行的查詢另存為跟蹤(.trc)文件,再打開數據庫引擎優化顧問,做如下圖操作

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

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

Sql代碼
  1. CREATENONCLUSTEREDINDEXindex1ON[dbo].[Pub_AidBasicInformation]
  2. (
  3. [AidBasicInfoId]ASC
  4. )
  5. CREATENONCLUSTEREDINDEXindex1ON[dbo].[Pub_Application]
  6. (
  7. [ApplicationId]ASC,[ReviewUserId]ASC,[AidBasicInfoId]ASC,[CreateOn]ASC
  8. )
  9. CREATENONCLUSTEREDINDEXindex1ON[dbo].[Pub_Consult1]
  10. (
  11. [Directory]ASC,[ApplicationId]ASC
  12. )
  13. CREATENONCLUSTEREDINDEXidnex1ON[dbo].[Review_Aid_UseTraining_Record]
  14. (
  15. [AidReferralId]ASC,[ApplicationId]ASC
  16. )

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

Sql代碼Flashva
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 华宁县| 沂南县| 天门市| 佛学| 温州市| 紫金县| 拉萨市| 平舆县| 孙吴县| 都安| 明水县| 济南市| 西和县| 类乌齐县| 紫金县| 南木林县| 西吉县| 乃东县| 红安县| 贵南县| 永顺县| 石棉县| 油尖旺区| 翁牛特旗| 麟游县| 赤城县| 中西区| 平利县| 茌平县| 竹山县| 依安县| 许昌市| 靖宇县| 平果县| 旺苍县| 抚州市| 浑源县| 沿河| 抚宁县| 大荔县| 西林县|