我有正在採取一些嚴重的時間上比任何過去,說,小時值數據的較舊的執行查詢。這將創建一個將用於數據挖掘的視圖,所以期望它能夠搜索數週或數月的數據並在合理的時間內返回(即使幾分鐘也沒問題)...我運行的日期範圍爲10/3/2011 12:00pm
至10/3/2011 1:00pm
,花了44分鐘!)加快SQL查詢
問題在於底部有兩個LEFT OUTER JOIN
s。當我把它們拿出來時,它可以在大約10秒內運行。但是,這些是這個查詢的麪包和黃油。
這一切都是從一個表來。該查詢返回的結果與原始表格不同的是xweb_range
。 xweb_range
是計算字段列(範圍),其中其對應的[LO,LC,RO,RC]_Sensor_Alarm = 0
這隻會從[LO,LC,RO,RC]_Avg
使用的值(不要範圍計算包括如果傳感器報警= 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
我覺得這是一個可以接受的問題。但是,您需要發佈您的表架構以及有關您設置的任何索引的信息。 – jadarnel27
首先最明顯的問題 - **是否有一個索引'ROWNUMBER包括:(值)'** – JNK
而且,你知道'CTE's只是一次性的觀點,正確的?沒有性能優勢?你基本上有3個級別的嵌套視圖,你是在這裏聚集...... – JNK