Вставка записей в кучу занимает очень много времени - PullRequest
0 голосов
/ 03 октября 2019

У меня есть предопределенная таблица из примерно 35 полей, в основном определяемых как nvarchar (255) и nullable.

В этой таблице нет никаких ограничений, индексов или триггеров любого типа.

У меня есть запрос, который возвращает примерно 32 тыс. Записей. Если я вставлю это непосредственно в новую постоянную таблицу на лету, то есть

SELECT <<fields>> INTO dbo.MadeUpTable01 FROM <<my query goes here>>

, это займет около 3 секунд.

Когда я пытаюсь вставить в свою реальную, заранее определенную таблицу,либо непосредственно из моего запроса, либо из моей новой постоянной таблицы, например:

INSERT dbo.MyRealTable SELECT * FROM dbo.MadeUpTable01

, тогда это займет более 25 секунд.

Я единственный человек, работающий на этом сервере, и администратор БД подтвердил, что нет проблем с вводом / выводом, ЦП, таблицей временных параметров и т. Д. Я в тупике. В чем проблема?

РЕДАКТИРОВАТЬ: вы можете видеть здесь, что вставка таблицы составляет 65% от стоимости запроса, хотя в этой таблице не должно быть ничего, чтобы запретить вставку.

execution plan

1 Ответ

2 голосов
/ 03 октября 2019

Разница во времени вызвана logging.

В случае

SELECT <> INTO dbo.MadeUpTable01 FROM <>

у вас есть minimal logging в simple и bulk logged моделях восстановления. Я предполагаю, что ваша база данных находится в simple, потому что если нет, то ваша select into заняла почти то же время, что и insert into.

INSERT dbo.MyRealTable SELECT * FROM dbo.MadeUpTable01

- это fully logged в вашем случае, потому что вы не использовали tablock подсказку в таблице назначения.

Здесь Руководство по производительности загрузки данных вы можете найти более подробную информацию по logging и minimal logging условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...