Преобразование запроса с курсором в более оптимизированную методологию

#sql-server-2008-r2

#sql-server-2008-r2

Вопрос:

У меня есть таблица со многими столбцами, но два из них представляют интерес в данном случае. Один из столбцов представляет номер коммита subversion, а другой предварительно представляет временную метку того, когда автоматизированный процесс выполнялся с использованием данных из вышеупомянутого номера коммита. Существует множество строк с одинаковым номером фиксации и любым числом, большим или равным 1 от метки времени. Мне нужно получить список различных номеров фиксации и самую раннюю временную метку в таблице для каждого из них.

Я могу сделать это с помощью курсора, который выполняет итерацию между различными номерами фиксаций и находит верхнюю временную метку 1 для каждой фиксации, но это очень медленно, потому что в таблице 56 миллионов строк. Я уверен, что должен быть более эффективный способ.

Ниже вы можете увидеть мой TSql.

 DECLARE @CommitDates TABLE (CommitNumber int, LastUpdate date)
declare @commit int

DECLARE db_cursor CURSOR FOR
SELECT DISTINCT [CommitNumber] FROM ProcessHistory ORDER BY [CommitNumber] DESC

OPEN db_cursor
fetch next from db_cursor into @commit

while @@FETCH_STATUS=0
BEGIN
    INSERT INTO @CommitDates ([CommitNumber], [LastUpdate]) 
    select top 1 [CommitNumber],LastUpdate from ProcessHistory WHERE [CommitNumber]=@commit ORDER BY LastUpdate ASC
    fetch next from db_cursor into @commit
END
CLOSE db_cursor
deallocate db_cursor
SELECT * from @CommitDates

  

Ожидаемые результаты: возможность быстро узнать, на какую дату в таблице появляется заданный номер фиксации, без необходимости вызывать средство просмотра журнала subversion. В этом случае я бы определил «быстро» как выполнение не более чем за 60 секунд.

Фактические результаты: выполнение этого кода занимает более 7 минут 30 секунд, который на сегодняшний день возвращает только 176 строк.

Ответ №1:

Ну, я чувствую себя глупо, просто понял это:

ВЫБЕРИТЕ [CommitNumber],MIN([LastUpdate]) Из ProcessHistory GROUP По [CommitNumber]

Выполняется буквально в 00:00:02