#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