Tôi có một truy vấn đang dành một số thời gian nghiêm trọng để thực hiện trên bất kỳ dữ liệu nào cũ hơn quá khứ, ví dụ như số giờ dữ liệu. Điều này sẽ tạo ra một khung nhìn sẽ được sử dụng để datamining, do đó, kỳ vọng là nó sẽ có thể tìm kiếm tuần hoặc tháng của dữ liệu và trở lại trong một khoảng thời gian hợp lý (thậm chí một vài phút là tốt ... Tôi chạy trong phạm vi ngày của 10/3/2011 12:00pm
đến 10/3/2011 1:00pm
và mất 44 phút!)tăng tốc Truy vấn SQL
Vấn đề là với hai số LEFT OUTER JOIN
s ở dưới cùng. Khi tôi lấy chúng ra, nó có thể chạy trong khoảng 10 giây. Tuy nhiên, đó là bánh mì và bơ của truy vấn này.
Tất cả điều này đến từ một bảng. Điều duy nhất truy vấn này trả về khác với bảng gốc là cột xweb_range
. xweb_range
là một cột lĩnh vực tính toán (range) mà sẽ chỉ sử dụng các giá trị từ [LO,LC,RO,RC]_Avg
nơi họ tương ứng [LO,LC,RO,RC]_Sensor_Alarm = 0
(không bao gồm trong tính toán phạm vi nếu báo động cảm biến = 1)
WITH Alarm (sub_id,
LO_Avg, LO_Sensor_Alarm, LC_Avg, LC_Sensor_Alarm, RO_Avg, RO_Sensor_Alarm, RC_Avg, RC_Sensor_Alarm) AS (
SELECT sub_id, LO_Avg, LO_Sensor_Alarm, LC_Avg, LC_Sensor_Alarm, RO_Avg, RO_Sensor_Alarm, RC_Avg, RC_Sensor_Alarm
FROM dbo.some_table
where sub_id <> '0'
)
, AddRowNumbers AS (
SELECT rowNumber = ROW_NUMBER() OVER (ORDER BY LO_Avg)
, sub_id
, LO_Avg, LO_Sensor_Alarm
, LC_Avg, LC_Sensor_Alarm
, RO_Avg, RO_Sensor_Alarm
, RC_Avg, RC_Sensor_Alarm
FROM Alarm
)
, UnPivotColumns AS (
SELECT rowNumber, value = LO_Avg FROM AddRowNumbers WHERE LO_Sensor_Alarm = 0
UNION ALL SELECT rowNumber, LC_Avg FROM AddRowNumbers WHERE LC_Sensor_Alarm = 0
UNION ALL SELECT rowNumber, RO_Avg FROM AddRowNumbers WHERE RO_Sensor_Alarm = 0
UNION ALL SELECT rowNumber, RC_Avg FROM AddRowNumbers WHERE RC_Sensor_Alarm = 0
)
SELECT rowNumber.sub_id
, cds.equipment_id
, cds.read_time
, cds.LC_Avg
, cds.LC_Dev
, cds.LC_Ref_Gap
, cds.LC_Sensor_Alarm
, cds.LO_Avg
, cds.LO_Dev
, cds.LO_Ref_Gap
, cds.LO_Sensor_Alarm
, cds.RC_Avg
, cds.RC_Dev
, cds.RC_Ref_Gap
, cds.RC_Sensor_Alarm
, cds.RO_Avg
, cds.RO_Dev
, cds.RO_Ref_Gap
, cds.RO_Sensor_Alarm
, COALESCE(range1.range, range2.range) AS xweb_range
FROM AddRowNumbers rowNumber
LEFT OUTER JOIN (SELECT rowNumber, range = MAX(value) - MIN(value) FROM UnPivotColumns GROUP BY rowNumber HAVING COUNT(*) > 1) range1 ON range1.rowNumber = rowNumber.rowNumber
LEFT OUTER JOIN (SELECT rowNumber, range = AVG(value) FROM UnPivotColumns GROUP BY rowNumber HAVING COUNT(*) = 1) range2 ON range2.rowNumber = rowNumber.rowNumber
INNER JOIN dbo.some_table cds
ON rowNumber.sub_id = cds.sub_id
Tôi nghĩ rằng đây là một câu hỏi có thể chấp nhận. Tuy nhiên, bạn cần phải đăng lược đồ bảng và thông tin về bất kỳ chỉ mục nào bạn đã thiết lập. – jadarnel27
Câu hỏi rõ ràng nhất đầu tiên - ** Có chỉ mục trên 'Rownumber INCLUDE (giá trị)'? ** – JNK
Ngoài ra, bạn biết 'CTE' s chỉ là một lần xem, phải không? Không có lợi ích hiệu suất? Về cơ bản, bạn có 3 cấp độ xem lồng nhau mà bạn đang tổng hợp ở đây ... – JNK