次のようなテーブルが40個あり、各テーブルには3,000万件のレコードが含まれています。
テーブルRawData
:PK(CaregoryID
、Time
)
CategoryID Time IsSampled Value
-----------------------------------------------------------
1 2012-07-01 00:00:00.000 0 -> 1 65.36347
1 2012-07-01 00:00:11.000 0 80.16729
1 2012-07-01 00:00:14.000 0 29.19716
1 2012-07-01 00:00:25.000 0 -> 1 7.05847
1 2012-07-01 00:00:36.000 0 -> 1 98.08257
1 2012-07-01 00:00:57.000 0 75.35524
1 2012-07-01 00:00:59.000 0 35.35524
現在のところ、IsSampled
列はすべてのレコードで0です。
レコードを更新する必要があります。これにより、各CategoryIDと各分の範囲で、Max(Value)、Min(Value)、および最初のレコードのレコードのが1になりIsSampled
ます。
以下は私が作成した手続き型クエリですが、実行に時間がかかりすぎます。(各テーブルで約2時間30分)
DECLARE @startRange datetime
DECLARE @endRange datetime
DECLARE @endTime datetime
SET @startRange = '2012-07-01 00:00:00.000'
SET @endTime = '2012-08-01 00:00:00.000'
WHILE (@startRange < @endTime)
BEGIN
SET @endRange = DATEADD(MI, 1, @startRange)
UPDATE r1
SET IsSampled = 1
FROM RawData AS r1
JOIN
(
SELECT r2.CategoryID,
MAX(Value) as MaxValue,
MIN(Value) as MinValue,
MIN([Time]) AS FirstTime
FROM RawData AS r2
WHERE @startRange <= [Time] AND [Time] < @endRange
GROUP BY CategoryID
) as samples
ON r1.CategoryID = samples.CategoryID
AND (r1.Value = samples.MaxValue
OR r1.Value = samples.MinValue
OR r1.[Time] = samples.FirstTime)
AND @startRange <= r1.[Time] AND r1.[Time] < @endRange
SET @startRange = DATEADD(MI, 1, @startRange)
END
これらのテーブルをより速く(おそらく非手続き的な方法で)更新する方法はありますか?ありがとう!