У меня есть 2 таблицы «а» и «б». Таблица «а» имеет около 1 миллиона записей. Таблица «b» содержит около 50 000 записей. Некластеризованный индекс определен для столбца, каждый в 'a' & 'b'. 2 таблицы объединены на основе этих столбцов. Запрос выглядит следующим образом:
SELECT * INTO x
FROM a JOIN b ON a.cola = b.colb
Конечный результат - около 2 миллионов записей. Запрос занимает около 14 минут. Однако, если я попытаюсь выполнить COUNT (*) вместо SELECT ... INTO, выполнение запроса займет менее минуты.
SELECT COUNT(*)
FROM a JOIN b ON a.col1 = b.col1
Я предположил, что оставшиеся 13 минут были из-за операций ввода-вывода. Поэтому я запустил другой запрос, который просто взял ранее вставленные данные из «x» и вставил в «y».
SELECT * INTO y
FROM x
Этот запрос занял 5 минут, чтобы вставить 2 миллиона строк данных. Мой вопрос заключается в том, что является причиной, по которой первый запрос занимает 14 минут, в то время как общее время для фактического соединения и независимой вставки того же набора данных составляет всего 6 минут. В чем причина оставшихся 8 минут времени выполнения? Можно ли как-нибудь сократить это время?
Я посмотрел фактический план выполнения первого запроса. > 95% времени используется в операции INSERT. Операция INSERT просто вставляет столбцы как есть - никакой дополнительной логики (например, вычисления, CAST, CASE ... WHEN и т. Д.) Нет. Моя база данных уже находится в режиме восстановления BULK_LOGGED, поэтому эти операции SELECT ... INTO минимально регистрируются.