私は、過去の、例えば何時間ものデータよりも古いもので実行するために深刻な時間を費やしているクエリを持っています。これはデータマイニングに使用されるビューを作成するため、数週間または数ヶ月のデータを検索して妥当な時間内に返すことができるという期待があります(数分でも問題ありません... 10/3/2011 12:00pm
〜10/3/2011 1:00pm
の日付範囲で実行され、44分かかりました!)SQLクエリを高速化する
問題は下の2つのLEFT OUTER JOIN
です。私はそれらを取るとき、約10秒で実行することができます。しかし、これらはこのクエリのパンとバターです。
これはすべて1つのテーブルから来ています。このクエリが元のテーブルと異なるだけ返すのは、列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 INCLUDE(value)'にインデックスがありますか?** – JNK
また、 'CTE'は単なる使い捨てビューであることは知っていますか?パフォーマンス上の利点はありませんか?あなたは基本的にここに集約しているネストされたビューの3つのレベルがあります... – JNK