テーブル内のすべての一意の ID の「ID」、最小値、および最大値を選択するという単純なタスクが与えられました。だから私は簡単に書きgroup by
ましたが、クエリの実行には時間がかかりました(30〜60秒)
SELECT CHPDataElement.DataElementID, MIN(CHPDataElementData.UTCDataTime) AS MinDataTime, MAX(CHPDataElementData.UTCDataTime) AS MaxDataTime
FROM CHPDataElement INNER JOIN
CHPDataElementData ON CHPDataElement.DataElementID = CHPDataElementData.DataElementID
GROUP BY CHPDataElement.DataElementID
order by
CHPDataElement.DataElementID
それで改善に取り組み始めました。そして、同じデータを 0.3 ~ 0.5 秒で返す単純な反復を思いつきました。
declare @result table
(
DataElementID int,
MinDataTime datetime NULL,
MaxDataTime datetime null
)
declare @currentID int
declare @nextID int
declare @time datetime
insert into @result (DataElementID, MinDataTime, MaxDataTime)
select DataElementID,null,null from CHPDataElement
order by DataElementID
select top 1 @currentID=DataElementID from @result
while @currentID is not null
begin
print @currentID
select top 1 @time=UTCDataTime from CHPDataElementData
where DataElementID = @currentID
order by UTCDataTime asc
update @result set MinDataTime = @time
where DataElementID = @currentID
select top 1 @time=UTCDataTime from CHPDataElementData
where DataElementID = @currentID
order by UTCDataTime desc
update @result set MaxDataTime = @time
where DataElementID = @currentID
set @nextID = null
select top 1 @nextID=DataElementID from @result where DataElementID > @currentID
set @currentID = @nextID
end
select * from @result
'group by' が 2 番目のクエリに比べて非効率的である理由を誰か説明できますか?