SQL SERVER - INSERT INTO .. ​​SELECT .. приводит к другому нет. строк вставлено, чем в самом SELECT .. - PullRequest
0 голосов
/ 10 августа 2009

Я выполняю простой запрос вставки, как показано ниже: INSERT INTO tbl_destination ... SELECT ... FROM [SomeOtherLinkedServer] .tbl_source

В результате получается 3 000 000 строк, вставленных в таблицу назначения, хотя SELECT возвращает 9 000 000 строк. В чем может быть причина? Я использую SQL Server 2005 Standard Edition. Таблица назначения и исходная таблица расположены на двух разных серверах SQL. Сообщение об ошибке не отображается. Таблица назначения служит как временная куча данных - она ​​не имеет ничего. ключ, без индексов. Я проверил дисковое пространство и количество доступного пространства для tbl_destination - много ГБ. Странно .. Я буду очень признателен за любые предложения!

редактирование: Спасибо за ваши предложения. Когда я запускал SELECT COUNT (*) как локально (на связанном сервере), так и при входе в систему на самом связанном сервере, он показывал 9M строк. Однако, когда я запустил фактический SELECT ... на связанном сервере:

SELECT ... FROM [SomeOtherLinkedServer].tbl_source

результат - 3M строк и сообщений об ошибках нет. Тот же запрос выполняется при входе на удаленный сервер:

SELECT ... FROM tbl_source

также вернул 3M строк, но на этот раз с сообщением об ошибке (похоже, что при выполнении запроса, использующего таблицы на связанном сервере, не отображаются все сообщения об ошибках):

Msg 701, Level 17, State 123, Line 1

There is insufficient system memory to run this query.

Так что теперь ясно, что это проблема с памятью. Есть ли способ (без установки дополнительной памяти на сервере), чтобы преодолеть эту проблему - вставить весь результат этого запроса в таблицу? Спасибо! Еще одна вещь - tbl_source на самом деле не таблица, это представление. К сожалению, поддерживается кем-то другим, так что оптимизация его внутренних функций не вариант (по крайней мере, пока).

Ответы [ 2 ]

1 голос
/ 11 августа 2009

Рассматривали ли вы разделение результатов и пакетную вставку?

Insert into...
Select * from ....
Where rowid between 0 and 1000000


Insert into...
Select * from ....
Where field1 between 1000000 and 2000000

...etc
0 голосов
/ 10 августа 2009

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

select * into destination_table
from [otherserver].otherdb.dbo.other_table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...