Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ускорить insert into select from  [new]
user89
Member

Откуда:
Сообщений: 2083
Есть задача регулярно заливать искаженные/тестовые данные на Link-сервер для подрядчика. В целях безопасности он не видит SQL-сервер источник, но источник его видит и данные можно "заталкивать".
Самый быстрый способ
select into Linkserver.Base.dbo.TargetTable from SourceTable
с линк-серверами не работает. Работает стандартный способ
insert into Linkserver.Base.dbo.TargetTable select from SourceTable

Но скорость очень низкая. Заметил, что если вставлять пачками по 2 тыс. записей, то сильно ускоряется. Нашел хороший топик про delete. Но никак не получается прикрутить для insert
SQL 2008 R2
2 июн 16, 17:18    [19251285]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить insert into select from  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
user89,

используйте SSIS

DataFlow c FastLoad
2 июн 16, 17:24    [19251316]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить insert into select from  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
user89,

если хотите пачками - введите идентификатор, можно timestamp. Если это прямой забор с одной таблицы в другу быстрее работать будет bcp. Я так понимаю на TargetTable нет ни триггеров ни конестрейнов?
2 июн 16, 17:34    [19251374]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить insert into select from  [new]
user89
Member

Откуда:
Сообщений: 2083
SSIS не помню точно почему, но не подходит...

На всех TargetTable нет ни триггеров ни конестрейнов. Утилиту bcp изучаю, но там только такой порядок?
1. Выгрузить в текстовый файл
2. Скопировать файл на Target Server
3. Залить этот текстовый файл в таблицу

Таблиц много, около 200. Получаю курсор через
select name from sys.objects
where [type] = 'u'
В теле курсора
insert into Linkserver.Base.dbo.TargetTable select from SourceTable

Попробую сюда bcp вставить...
2 июн 16, 18:03    [19251492]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить insert into select from  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
user89,

Выполните настройки копирования в мастере экпорта, сохраните пакет. Пакет можно загрузить в проект SSIS, редактировать или же просто выполнять, когда требуется. BCP, в общем-то, вчерашний день, оставлен только для совместимости старого софта. SSIS имеет гораздо более развитый инструментарий.
2 июн 16, 18:17    [19251549]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить insert into select from  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
user89
SSIS не помню точно почему, но не подходит...





В SSIS есть transfer database objects task, которая может массово перегнать много таблиц, если у вас это разовая операция
2 июн 16, 18:39    [19251612]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить insert into select from  [new]
user89
Member

Откуда:
Сообщений: 2083
Операция минимум 2 раза в день.

SSIS действительно работает быстрее, но есть ещё дополнительные операции, хочется всё в одном скрипте...
В общем, нашел вариант приемлемый по скорости
declare @i int = 0;

select *, (row_number() over (order by (select 1))-1)/2000 +1 [gr]
into #page
from SourceTable

Begininsert:
  set @i = @i + 1;

  insert Linkserver.Base.dbo.TargetTable
    select * from #page
    where gr = @i

if @@rowcount > 0 goto Begininsert;

Всем спасибо за помощь!
2 июн 16, 18:50    [19251640]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить