MSSQL - Вопрос о том, как выполняются запросы вставки - PullRequest
0 голосов
/ 04 сентября 2018

У нас есть две таблицы, которые мы хотим объединить. Скажем, table1 и table2. У них одинаковые столбцы и одно и то же назначение. Разница в том, что таблица2 имеет более новые данные. Мы использовали запрос, который использует LEFT JOIN, чтобы найти общие для них строки и пропустить эти строки при объединении. Проблема в этом. обе таблицы имеют 500 миллионов строк.

Когда мы запускали запрос, он продолжался и продолжался. В течение часа он просто продолжал работать. Мы были уверены, что это из-за большого количества строк.

Но когда мы захотели увидеть, сколько строк уже было вставлено в table2, мы запустили код select count(*) from table2, он дал нам точно такое же количество строк в table2, как и при запуске.

Наши вопросы таковы, как это должно быть? Вставляются ли все строки одновременно после того, как все совпадения найдены?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Данные не вставляются или обновляются по одному.

Понятия не имею, как это связано с "Select count(*) from table2 WITH (NOLOCK) "

Join condition занимает слишком много времени для создания Resultset, который будет использоваться оператором вставки. Так что на самом деле вставки нет, потому что результат не создается.

Запрос на присоединение занимает слишком много времени, поскольку условие левого соединения приводит к очень очень высокому cardinality estimate.

так что сначала нужно исправить условие соединения.

для этого нужна другая информация, такая как схема таблицы, тип и длина данных и существующий индекс, требование.

0 голосов
/ 04 сентября 2018

Если вы хотите прочитать незафиксированные данные, то счетчик должен быть изменен, например:

select count(*) from table2 WITH (NOLOCK) 

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

...