視圖查詢性能的新認識
阿新 • • 發佈:2017-10-01
count get tle htm identity seda upd 計劃 hot
前兩天做系統調優的時候,想著把一系列的表聯合查詢換成視圖查詢,這樣速度就會快些,但是效果卻不是很理想。下面我把相關實驗過程記錄下來。
原sql語句是一個表聯合查詢,WorkOrder表數據有200多萬條。下面代碼是一個是聯合查詢,一個是將聯合查詢建成一個視圖。
declare @d1 datetime declare @d2 datetime set @d1=getdate() --聯合查詢 SELECT WO.WorkOrderCode,WO.WorkOrderType,WO.Status,WO.CustName,WO.CustTel1,WO.CustTel2,WO.CustIdentityNo,WO.CardId,WO.CustSex,WO.CustAge,WO.CustBirthday, WO.IsMember,WO.AccountLevel,WO.MemberDate,WO.AccountScore,WO.DestTarget,WO.DestTargetDesc,WO.Source,WO.ToType,WO.Dept,WO.HotelId,WO.HotelName, WO.HotelCreateDate,WO.HotelType,WO.HotelBrand,WO.HotelTel,WO.HotelBigArea,WO.HotelArea,WO.HotelCityGroup,‘‘AS HotelCity,WO.Title,WO.SelectTitle,WO.Content,WO.IsAccept,WO.CompensateDept, WO.CompensateAmountType,WO.CompensateAmount,WO.ReferDept,WO.ResponsiblePerson,W2.Attribute3 AS ResponsiblePersonName,WO.ResponsibleDate,WO.ClosePerson, WO.CloseDate,WO.CatePerson,WO.CateDate,WO.ScorePerson,WO.ScoreDate,WO.CreateUser,WO.CreateDate,WO.UpdateUser,WO.UpdateDate,W1.Attribute3 ASUserName FROM WorkOrder WO WITH (NOLOCK) LEFT JOIN WSCUser W1 ON WO.CreateUser=W1.UserID LEFT JOIN WSCUser W2 ON WO.ResponsiblePerson=W2.UserID WHERE 1=1 AND WO.STATUS=3 AND WO.WorkOrderType=‘T‘ select [語句執行花費時間(毫秒)]=datediff(ms,@d1,getdate()) set @d2=getdate() --視圖查詢SELECT WO.WorkOrderCode,WO.WorkOrderType,WO.Status,WO.CustName,WO.CustTel1,WO.CustTel2,WO.CustIdentityNo,WO.CardId,WO.CustSex,WO.CustAge,WO.CustBirthday, WO.IsMember,WO.AccountLevel,WO.MemberDate,WO.AccountScore,WO.DestTarget,WO.DestTargetDesc,WO.Source,WO.ToType,WO.Dept,WO.HotelId,WO.HotelName, WO.HotelCreateDate,WO.HotelType,WO.HotelBrand,WO.HotelTel,WO.HotelBigArea,WO.HotelArea,WO.HotelCityGroup,‘‘ AS HotelCity,WO.Title,WO.SelectTitle,WO.Content,WO.IsAccept,WO.CompensateDept, WO.CompensateAmountType,WO.CompensateAmount,WO.ReferDept,WO.ResponsiblePerson, ResponsiblePersonName,WO.ResponsibleDate,WO.ClosePerson, WO.CloseDate,WO.CatePerson,WO.CateDate,WO.ScorePerson,WO.ScoreDate,WO.CreateUser,WO.CreateDate,WO.UpdateUser,WO.UpdateDate, WO.UserName FROM V_WorkOrder_WSCUser wo WHERE 1=1 AND WO.STATUS=3 AND WO.WorkOrderType=‘T‘ select [語句執行花費時間(毫秒)]=datediff(ms,@d2,getdate())
我執行了5次這段代碼,5次結果如下。
第一次執行 | 第二次執行 | 第三次執行 | 第四次執行 | 第五次執行 | |
表聯合 | 1983ms | 3266ms | 2530ms | 3796ms | 3076ms |
視圖 | 1903ms | 2580ms | 3070ms | 3343ms | 3260ms |
看到這五次執行時間的對比,發現視圖對查詢效率並沒有提高,再看執行計劃,也是一樣。
所以總結一下,視圖對於查詢效率的提升相對於聯合查詢來說,並沒有提升,對開發效率有提升。
最後,國慶節中秋節,雙節快樂。
參考:關於視圖 和存儲過程效率的問題
T-SQL查詢進階--深入淺出視圖
視圖查詢性能的新認識