Почему SELECT * INTO x ИЗ СОЕДИНЕНИЯ b занимает значительно больше времени, чем общее время SELECT COUNT (*) FROM JOIN b & SELECT * INTO y FROM x? - PullRequest
0 голосов
/ 22 января 2019

У меня есть 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 минимально регистрируются.

1 Ответ

0 голосов
/ 22 января 2019

Это операции ввода / вывода.JOIN должен обрабатывать все данные, а не только количество строк.Вы не учитываете это время обработки.

Учитывая работу, которую должен выполнить JOIN, дополнительное чтение / запись данных кажется правильным.

...