Время прочтения: 2 мин.

Зачастую IT-специалисты сталкиваются с необходимостью выгрузки больших объемов данных (данные по денежным операциям, информация о контрагентах и т.д.), при этом выгрузка должна быть выполнена в сжатые сроки. Извлечение данных за интервал времени из очень большой таблицы используя оператор «SELECT» с ограничениями на дату – задача зачастую нереализуемая, по причине длительности выполнения запроса. Поэтому для достижения цели мы будем «есть слона по кусочкам», как советуют нам специалисты лидерского мастерства. Для этого итеративно будем производить загрузку требуемых данных с частотой в один день в рамках интересующего временного интервала.

Приведём пример, реализующий данный принцип (в разделах «from» и «where» могут находиться какие угодно связанные таблицы и условия):

declare @date_start date = '2019-01-01',	-- дата начала интервала
        @date_end date = '2019-12-31'	-- дата конца интервала
while @date_start <= @date_end		-- цикл пока дата начала не больше даты конца 
begin
	insert into table_result
	select value1, ... valueN from table_source where date_event=@date_start

    set @date_start = dateadd(day,1,@date_start) --увеличиваем значение даты начала 
end

Объявляем две переменные, ограничивающие наш интервал. Организуем цикл, пока значение первой переменной не превысит значение второй. Выбираем данные за дату, равную первой переменной и добавляем в результирующую таблицу. Увеличиваем значение первой переменной. Заранее необходимо создать таблицу для записи результатов. После первой итерации план выполнения запроса сохранится в кэше планов, за счет чего время выполнения запросов сократится.

Данный подход мы будем тестировать на реальной, «боевой» задаче. В ходе работы возникла необходимость в выгрузке информации об авторизации пользователей в системе за определенный период времени. Размер исходной таблицы составлял более 2 млрд. записей.

Результаты применения обычного оператора SELECT и рассматриваемого алгоритма для поиска данных об одном пользователе в системе и его авторизациях представлены в таблице ниже:

МетодВремя выполнения
SELECT01:01:51
алгоритм00:12:31

Как можно видеть из таблицы, предлагаемый подход позволяет значительно ускорить скорость обработки и выгрузки данных из очень больших таблиц.

Так же стоит отметить, что данное решение может быть аллоцировано на ряд других вопросов, где требуется быстрая выгрузка данных.