1. 程式人生 > >視圖查詢性能的新認識

視圖查詢性能的新認識

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 AS
UserName 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查詢進階--深入淺出視圖

視圖查詢性能的新認識