1

テーブル内のすべての一意の 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 番目のクエリに比べて非効率的である理由を誰か説明できますか?

4

2 に答える 2

0

CHPDataElementData に DataElementID のインデックスを付けます。

于 2013-04-30T09:20:20.243 に答える