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
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ơn và STATISTICS IO, 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 độ
Xóa hàm [FN_GetLocalTime_FromUTC_BasingOnTZId] tạo ra sự khác biệt nhỏ về tốc độ, đây là STATISTICS IO TIME
loại bỏ cả mệnh đề và hàm không SARG: Đây là kế hoạch thực hiện
Đây là đầu ra cho truy vấn không thay đổi ngoại trừ việc thêm một LOOP JOIN
gợi ý. Đây là chậm hơn.
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_Statuses
bả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_Trip
và FACT_Trip_Attributes
là lối thoát. Làm thế nào để tôi sửa lỗi này? Thêm OPTION RECOMPILE
sự 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ó JOIN
gợi ý, không giúp được gì.
HASH tham gia gợi ý và TF 4199
LOOP tham gia gợi ý và TF 4199
Không có gợi ý tham gia và TF 4199
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)
FN_GetLocalTime_FromUTC_BasedOnTZId
chứ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 SELECT
danh 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 SELECT
danh sách không (việc đăng hàm có thể trả lời câu hỏi này) không?