Cải thiện hiệu suất truy vấn tham số


7

Tôi đã được giao nhiệm vụ cải thiện hiệu năng của truy vấn SQL Server 2008 R2 (trong một quy trình được lưu trữ) được hiển thị trong liên kết kế hoạch thực hiện truy vấn bên dưới.

Nó hiện đang thực thi trong khoảng 7 giây và cần hoàn thành trong 1-2 giây nếu có thể. Mỗi lần thực hiện truy vấn chậm luôn khoảng 7 giây. Các kết quả của câu hỏi nhỏ giọt thông qua. Các bảng được truy vấn là lớn nhưng không phải là hàng tỷ hàng.

Đếm hàng

Đếm hàng

Tùy thuộc vào các tham số được truyền, kết quả có thể là vài trăm hàng (thực thi phụ thứ hai) đến> 300K hàng (điều này chậm).

Tôi đã bao gồm kế hoạch thực hiện truy vấn chậm và các chỉ mục đang được sử dụng bởi trình tối ưu hóa. Đây là kế hoạch để thực hiện nhanh hơnSTATISTICS IO, TIME:

Như là StatsIO_Time

Có hai truy vấn đang được thực hiện. Điều đầu tiên không phải là vấn đề. Đó là cái thứ hai mà tôi cần trợ giúp. Mặc dù cần thiết, việc loại bỏ biến vị ngữ không SARGable ( AND FT.TripDistance < ( CONVERT(NUMERIC(10,0),FT.TripTime) * 83.33 )) tạo ra sự khác biệt nhỏ về tốc độ

loại bỏ không SARG

Xóa hàm [FN_GetLocalTime_FromUTC_BasingOnTZId] tạo ra sự khác biệt nhỏ về tốc độ, đây là STATISTICS IO TIMEloại bỏ cả mệnh đề và hàm không SARG: Đây là kế hoạch thực hiện

loại bỏ không SARG và Func

Đây là đầu ra cho truy vấn không thay đổi ngoại trừ việc thêm một LOOP JOINgợi ý. Đây là chậm hơn.

Vòng lặp

Tôi đã nhận thấy rằng trong kế hoạch truy vấn không thay đổi chậm, số lượng hàng thực tế (300330) cho Chỉ số Tìm kiếm trên FACT_trip_Statusesbảng gần với đầu ra cuối cùng (299887). Tuy nhiên, con số thực tế của hàng (4.87m) trên các chỉ số tìm kiếm trên xFactTrip_Annex, FACT_TripFACT_Trip_Attributeslà lối thoát. Làm thế nào để tôi sửa lỗi này? Thêm OPTION RECOMPILEsự khác biệt

Tôi đã thử thêm cờ theo dõi 4199 DBCC TRACEON (4199, -1);và thử lại có và không có JOINgợi ý, không giúp được gì.

HASH tham gia gợi ý và TF 4199

HASH tham gia gợi ý và TF4199

LOOP tham gia gợi ý và TF 4199

LOOP tham gia gợi ý và TF4199

Không có gợi ý tham gia và TF 4199

Không có gợi ý THAM GIA và TF4199

Chỉ số

CREATE NONCLUSTERED INDEX IDX_FACT_Trip_StartDateUTC_VehicleKey_Includes ON dbo.FACT_Trip
(
    StartDateUTC ASC,
    VehicleKey ASC,
    EndDateUTC ASC
)
INCLUDE (   DriverKey,
    DrivingTime,
    TripDistance,
    TripTime)

CREATE NONCLUSTERED INDEX IX_xFactTrip_Annex_StartDateUTC_MonthlyProcessing ON dbo.xFactTrip_Annex
(
    StartDateUTC ASC
)
INCLUDE (   VehicleKey,
            Spd20Count, Spd20Distance,
            Spd30Count, Spd30Distance,
            Spd40Count, Spd40Distance,
            Spd50Count, Spd50Distance,
            Spd60Count, Spd60Distance,
            Spd70Count, Spd70Distance,
            SpdCat1,SpdCat2,SpdCat3,
            TotalIdling,
            PTOTime,
            TripFuel) 

CREATE NONCLUSTERED INDEX IX_FACT_Trip_Attributes_StartDateUTC_VehicleKey_Includes ON dbo.FACT_Trip_Attributes
(
    StartDateUTC ASC,
    VehicleKey ASC,
    EndDateUTC ASC
)
INCLUDE (   Attribute0Distance,
    Attribute1Distance,
    Attribute2Distance,
    Attribute3Distance,
    Attribute4Distance,
    Attribute5Distance,
    Attribute6Distance,
    Attribute7Distance,
    Attribute8Distance,
    Attribute9Distance,
    Attribute10Distance)

CREATE NONCLUSTERED INDEX IDX_FACT_Trip_Statuses_StartDateUTC_VehicleKey_Includes ON dbo.FACT_Trip_Statuses
(
    VehicleKey ASC,
    StartDateUTC ASC,
    EndDateUTC ASC
)
INCLUDE (   HarshAccelerationCount,
    HarshBrakeCount,
    HarshBumpCount,
    HarshCorneringCount,
    ExcessIdleDuration,
    ExcessIdleCount,
    OverspeedCount)

CREATE NONCLUSTERED INDEX IX_StartDateUTC_VehicleKey_IsBP ON dbo.FACT_TripComments
(
    StartDateUTC ASC
)
INCLUDE (   VehicleKey, IsBusinessPrivate) 

Tất cả các công đoàn. bạn không thể sử dụng WHERE ... HOẶC ... HOẶC thay vì nhấn các bảng đó 4 lần riêng biệt? Ngoài ra, có cách nào để loại bỏ chức năng đó trong liên kết chéo không? Ngoài ra, bạn có cần gợi ý MAXDOP đó để ngăn chặn nó đi song song không?
Rich Benner

1
Nếu tôi đang đọc đúng kế hoạch, có vẻ như FN_GetLocalTime_FromUTC_BasedOnTZIdchức năng là nơi phần lớn thời gian trôi qua. Dường như các giá trị từ hàm đó chỉ được sử dụng trong SELECTdanh sách. Bạn có thể gửi chức năng đó? Ngoài ra: thay vì thực hiện trong hàm, bạn có thể thực hiện chuyển đổi ngày đó trực tiếp trong SELECTdanh sách không (việc đăng hàm có thể trả lời câu hỏi này) không?
RDFozz

Trông giống như một cơ sở dữ liệu Leica. Chúng tôi đã có một vấn đề giống hệt với cái tên chính xác UDF. Chúng tôi đã sử dụng một phương pháp khác để chuyển đổi sang giờ địa phương và có hiệu suất tốt hơn.
Nick.McDilyn 14/12/17

@ Nick.McDilyn đây không phải là cơ sở dữ liệu Leica. Tên của hàm giống nhau chỉ là trùng hợp ngẫu nhiên
Mazhar

Xin lỗi, là lỗi của tôi. Là chức năng sử dụng mã thủ tục để áp dụng bù thời gian cho thời gian UTC? Dù sao nếu bạn đã gỡ bỏ nó với sự khác biệt nhỏ nó có lẽ không quan trọng
Nick.McDermaid

Câu trả lời:


1

Có lẽ một chỉ mục được nhóm trên bảng tạm thời #xMilers có thể giúp bạn trong lần Tham gia cuối cùng

CREATE CLUSTERED INDEX IDX_xMobiles_VehicleKey ON #xMobiles
(
    VehicleKey ASC,
) 

Tùy chọn tốt nhất là tạo chỉ mục sau khi điền vào bảng.


0

Bây giờ, truy vấn này vẫn có lỗi và tôi không thể kiểm tra nó dựa trên dữ liệu của bạn, nhưng điều này có tạo ra kết quả tương tự và chạy nhanh hơn một chút không?

WITH cteBusGrps
  AS(
   SELECT
    LTRIM(RTRIM(CAST(A.Value AS INT))) 'BusGrpId', BG.BusinessGroupKey
   FROM
    dbo.FN_SplitString_AB (@nvBusGrpIds_csv, ',') A
   CROSS APPLY
    Warehouse.dbo.DIM_BusinessGroup BG
   WHERE
    vn = 1 
   AND
    BG.CtrackNodeID = CAST(A.Value AS INT)
  )
  INSERT INTO #xMobiles
  (
     NodeId
   , VehicleKey
   , VehicleId
   , CostCentreName
   , BusGrpId
   , BusGrpKey
   , AssignStart
   , AssignEnd
   , vGrpId
   , vGrpName
  )
  SELECT 
    V.vNodeId
   ,V.VehicleKey
   ,CAST(V.VehicleId AS NVARCHAR(50))
   ,V.CostCentreName
   ,V.BusGrpId
   ,V.BusinessGroupKey
   ,V.CreateDate
   ,COALESCE(V.DeletedTime,V.DeInstalled_DT,'2100-12-31 23:59:59') 
   ,V.vGrpId
   ,CAST(V.vGrpName AS NVARCHAR(100))
  FROM
   dbo.xED_Mobiles_OCC_ViewTable V
  INNER JOIN
   cteBusGrps      B ON B.BusinessGroupKey = V.BusinessGroupKey
  WHERE
   (
    ( CreateDate <= @dtStartDate_LT AND DeletedTime IS NULL ) 
    OR ( CreateDate <= @dtStartDate_LT AND DeletedTime BETWEEN @dtStartDate_LT AND @dtEndDate_LT )
    OR ( CreateDate BETWEEN @dtStartDate_LT AND @dtEndDate_LT ) 
    OR ( @dtStartDate_LT BETWEEN CreateDate AND COALESCE(V.DeletedTime,V.DeInstalled_DT,'2100-12-31 23:59:59')
  ) 

   SELECT
     M.BusGrpKey
    ,M.VehicleKey
    ,M.AssignStart
    ,M.AssignEnd
    ,FT.StartDateUTC
    ,D.LocalStartDateTime
    ,D.LocalEndDateTime
    ,CASE WHEN ISNULL(FT.DriverKey,0) < 1 THEN 0 ELSE ISNULL(FT.DriverKey,0) END 
            'DriverKey'
    ,CASE WHEN ISNULL(FT.DriverKey,0) < 1 THEN 1 ELSE 0 END
            'UnknownTrips'
    ,FTS.HarshAccelerationCount
    ,FTS.HarshBrakeCount
    ,FTS.HarshBumpCount
    ,FTS.HarshCorneringCount
    ,FTS.ExcessIdleDuration
    ,FTS.ExcessIdleCount
    ,FTS.OverspeedCount
    ,A.Spd20Count
    ,A.Spd20Distance
    ,A.Spd30Count
    ,A.Spd30Distance
    ,A.Spd40Count
    ,A.Spd40Distance
    ,A.Spd50Count
    ,A.Spd50Distance
    ,A.Spd60Count
    ,A.Spd60Distance
    ,A.Spd70Count
    ,A.Spd70Distance
    ,FT.TripDistance
    ,CONVERT(NUMERIC(10,0),FT.TripTime) * 83.33 'Ignore'
    ,FT.DrivingTime
    ,A.TotalIdling
    ,A.PTOTime
    ,FT.TripTime
    ,CAST( A.TripFuel AS DECIMAL(10,3))
            'TripFuel'
    ,CASE 
      WHEN CAST( A.TripFuel AS DECIMAL(10,3)) > 0 
       THEN FT.TripDistance
      ELSE 0
     END      'Tot_TF_DistTravelled'
    ,A.SpdCat1
    ,CAST(A.SpdCat2 AS INT)  'SpdCat2'
    ,CAST(A.SpdCat3 AS INT)  'SpdCat3'
    ,CASE   --EX-660
     WHEN FTA.Attribute0Distance > 0  THEN 0 
     WHEN FTA.Attribute1Distance > 0  THEN 1
     WHEN FTA.Attribute2Distance > 0  THEN 2
     WHEN FTA.Attribute3Distance > 0  THEN 3
     WHEN FTA.Attribute4Distance > 0  THEN 4
     WHEN FTA.Attribute5Distance > 0  THEN 5
     WHEN FTA.Attribute6Distance > 0  THEN 6
     WHEN FTA.Attribute7Distance > 0  THEN 7
     WHEN FTA.Attribute8Distance > 0  THEN 8
     WHEN FTA.Attribute9Distance > 0  THEN 9
     WHEN FTA.Attribute10Distance > 0 THEN 10
     ELSE 0
     END        'AttributeTypeId'
    ,ISNULL( TC.IsBusinessPrivate,0 ) 'BPOverride'
   FROM
    #xMobiles        M
   INNER JOIN
    Warehouse.dbo.FACT_Trip    FT ON FT.VehicleKey = M.VehicleKey
               AND FT.StartDateUTC BETWEEN @dtStartDate_LT AND @dtEndDate_LT
               AND FT.TripDistance < CONVERT(NUMERIC(10,0),FT.TripTime) * 83.33
   INNER JOIN
    dbo.xFactTrip_Annex      A ON A.VehicleKey = FT.VehicleKey
               AND A.StartDateUTC = FT.StartDateUTC
   INNER JOIN
    Warehouse.dbo.FACT_Trip_Statuses FTS ON FTS.VehicleKey = FT.VehicleKey
               AND FTS.StartDateUTC= FT.StartDateUTC
   INNER JOIN 
    Warehouse.dbo.FACT_Trip_Attributes FTA ON FTA.VehicleKey = FT.VehicleKey 
               AND FTA.StartDateUTC= FT.StartDateUTC
   LEFT JOIN
    Warehouse.dbo.FACT_TripComments  TC ON TC.VehicleKey = FT.VehicleKey
               AND TC.StartDateUTC = FT.StartDateUTC
   CROSS APPLY
    dbo.FN_GetLocalTime_FromUTC_BasedOnTZId(FT.StartDateUTC, FT.EndDateUTC, 2) D
   WHERE
   (
    ( FT.StartDateUTC BETWEEN M.AssignStart AND M.AssignEnd )
    OR ( M.AssignStart <= FT.StartDateUTC AND M.AssignEnd BETWEEN FT.StartDateUTC AND FT.EndDateUTC )
   ) 

gợi ý MAXDOP được thêm vào để ngăn truy vấn đi song song. Sửa đổi gần đây của bạn đã làm chậm truy vấn một chút. Ngoài ra, chức năng CROSS ỨNG DỤNG là bắt buộc và loại bỏ nó không làm thay đổi tốc độ.
Mazhar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.