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

Откуда:
Сообщений: 326
MSSQL 2008 R2 (10.50.6000)
БД Recovery model: Simple
Есть хранимая процедура, в которой обрабатываются данные, которые заносятся в подготовленную временную таблицу (несколько миллионов записей):
create table #small
(
	 [id] int identity(1,1)
	,[ID1] int not null
	,[ID2] int not null
	,[Type] tinyint not null
	,[Count] int not null
)

Кроме того, есть большая таблица [big] аналогичной структуры, в которой есть кластерный индекс по полю [id]. Больше никаких индексов нет.

Делаю вставку стандартно:
insert into [big]([ID1],[ID2],[Type],[Count])
	select [ID1],[ID2],[Type],[Count] from #small


Работает приемлемо, но хочется быстрее.

Как можно сделать?
18 июн 18, 23:05    [21501524]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 886
убрать как минимум свойство identity(1,1) как минимум.
Что по вашему быстро и какие сейчас проблемы?
Может у вас просто проблемы с вводом\выводом, которое все тормозит
19 июн 18, 00:09    [21501605]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30751
=Сергей=
Работает приемлемо, но хочется быстрее.
Что хочется быстрее, вставку в временную, или в большую таблицу?
Если второе, попробуйте вставку с минимальным логированием
insert into [big]([ID1],[ID2],[Type],[Count]) WITH (TABLOCK)
	select [ID1],[ID2],[Type],[Count] from #small
19 июн 18, 00:30    [21501627]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34592
alexeyvg
=Сергей=
Работает приемлемо, но хочется быстрее.
Что хочется быстрее, вставку в временную, или в большую таблицу?
Если второе, попробуйте вставку с минимальным логированием
insert into [big]([ID1],[ID2],[Type],[Count]) WITH (TABLOCK)
	select [ID1],[ID2],[Type],[Count] from #small



А где тут минимальное логирование?
19 июн 18, 08:02    [21501818]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34592
alexeyvg
=Сергей=
Работает приемлемо, но хочется быстрее.
Что хочется быстрее, вставку в временную, или в большую таблицу?
Если второе, попробуйте вставку с минимальным логированием
insert into [big]([ID1],[ID2],[Type],[Count]) WITH (TABLOCK)
	select [ID1],[ID2],[Type],[Count] from #small


Здесь только максимальное блокирование есть.
Совет то вредный...
19 июн 18, 08:03    [21501819]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
Щукина Анна
Member

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

вы перед своими ответами хоть с документацией сверяйтесь, что ли...

https://docs.microsoft.com/ru-ru/sql/t-sql/statements/insert-transact-sql?view=sql-server-2017
Рекомендации по массовому импорту данных
Использование инструкции INSERT INTO…SELECT для массового импорта данных с минимальным протоколированием
Инструкция INSERT INTO <target_table> SELECT <columns> FROM <source_table> может эффективно перенести большое количество строк из одной таблицы (например, промежуточной) в другую таблицу с минимальным протоколированием. Минимальное протоколирование может повысить производительность выполнения инструкции и снизить вероятность того, что во время операции будет заполнен весь журнал транзакций.

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

Модель восстановления базы данных настроена на простое или неполное протоколирование.

Целевой таблицей является пустая или непустая куча.

Целевая таблица не используется в репликации.

Для целевой таблицы указана подсказка TABLOCK.

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

В отличие от инструкции BULK INSERT, которая удерживает менее строгую блокировку массового обновления, инструкция INSERT INTO…SELECT с указанием TABLOCK удерживает монопольную блокировку (X) таблицы. Это означает, что отсутствует возможность вставки строк с помощью параллельных операций вставки.

TABLOCK - одно из обязательных требований.... Другое дело, что ТС упоминает о том, что целевая таблицы - с кластерным индексом. А "быстрая" вставка работает только в "кучу"...
Ну и про модель восстановления ТС ничего не говорил... А требуется, как минимум, "неполное протоколирование".
Но это -0 другая история и к таблоку оно не имеет никакого отношения...
19 июн 18, 08:13    [21501826]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
Щукина Анна
MasterZiv,

вы перед своими ответами хоть с документацией сверяйтесь, что ли...

https://docs.microsoft.com/ru-ru/sql/t-sql/statements/insert-transact-sql?view=sql-server-2017
Рекомендации по массовому импорту данных
Использование инструкции INSERT INTO…SELECT для массового импорта данных с минимальным протоколированием
Инструкция INSERT INTO <target_table> SELECT <columns> FROM <source_table> может эффективно перенести большое количество строк из одной таблицы (например, промежуточной) в другую таблицу с минимальным протоколированием. Минимальное протоколирование может повысить производительность выполнения инструкции и снизить вероятность того, что во время операции будет заполнен весь журнал транзакций.

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

Модель восстановления базы данных настроена на простое или неполное протоколирование.

Целевой таблицей является пустая или непустая куча.

Целевая таблица не используется в репликации.

Для целевой таблицы указана подсказка TABLOCK.

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

В отличие от инструкции BULK INSERT, которая удерживает менее строгую блокировку массового обновления, инструкция INSERT INTO…SELECT с указанием TABLOCK удерживает монопольную блокировку (X) таблицы. Это означает, что отсутствует возможность вставки строк с помощью параллельных операций вставки.

TABLOCK - одно из обязательных требований.... Другое дело, что ТС упоминает о том, что целевая таблицы - с кластерным индексом. А "быстрая" вставка работает только в "кучу"...
Ну и про модель восстановления ТС ничего не говорил... А требуется, как минимум, "неполное протоколирование".
Но это -0 другая история и к таблоку оно не имеет никакого отношения...
"Слона-то я и не заметил..."(с)
Модель же симпл. Значит, единственное оставшееся ограничение - наличие кластерного индекса на целевой таблице...
19 июн 18, 08:16    [21501829]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
=Сергей=,

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/dd425070(v=sql.100)
19 июн 18, 10:00    [21502151]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
=Сергей=
Member

Откуда:
Сообщений: 326
Друзья, большое спасибо за ответы.

Извините, не указал существенной информации, дополню свой пост:
информация в таблицу [big] загружается одновременно из нескольких (3-7) подключений (job).

Тогда, если я правильно понимаю, использование хинта TABLOCK будет накладывать блокировку на вставку из остальных подключений?
19 июн 18, 10:42    [21502269]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
=Сергей=
Тогда, если я правильно понимаю, использование хинта TABLOCK будет накладывать блокировку на вставку из остальных подключений?
Предложенную статью читать лень?
19 июн 18, 10:47    [21502292]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30751
=Сергей=
Друзья, большое спасибо за ответы.

Извините, не указал существенной информации, дополню свой пост:
информация в таблицу [big] загружается одновременно из нескольких (3-7) подключений (job).

Тогда, если я правильно понимаю, использование хинта TABLOCK будет накладывать блокировку на вставку из остальных подключений?
Да, т.к. у вас есть кластерный инедкс.
Но тут надо смотреть, может, один поток с минимальным логированием может быть быстрее, чем много потоков без него.
Ещё важно, что бы не использовалось сжатие.
19 июн 18, 13:25    [21503022]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
alexeyvg
Да, т.к. у вас есть кластерный инедкс.
Тоже решили не читать статью?
19 июн 18, 13:53    [21503197]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30751
invm
alexeyvg
Да, т.к. у вас есть кластерный инедкс.
Тоже решили не читать статью?
Эээ, читал, там для кластерного индекса написано "неконкурентный доступ", разве это не означает ответа на вопрос "Да, т.к. у вас есть кластерный инедкс."?
19 июн 18, 16:37    [21503886]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
alexeyvg
Эээ, читал, там для кластерного индекса написано "неконкурентный доступ"
С TABLOCK да. А без и с TF 610 - конкурентный.
Или вы сугубо по TABLOCK отвечали? Тогда я Вас недопонял.
19 июн 18, 16:53    [21503926]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
Eleanor
Member

Откуда:
Сообщений: 2624
invm
С TABLOCK да. А без и с TF 610 - конкурентный

Но все флаги, как обычно, используйте на свой страх и риск:
If trace flag 610 causes minimal logging to occur, you should generally see a performance improvement. But as always with trace flags, make sure you test for your specific environment and workload.
19 июн 18, 17:23    [21504037]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
Col
Member

Откуда: Торонто
Сообщений: 177
Eleanor
Но все флаги, как обычно, используйте на свой страх и риск:

Нет болл 610-го, почил в бозе.
В 2016-ом логика минимального логирования вклчена прямо из коробки.
19 июн 18, 18:37    [21504358]     Ответить | Цитировать Сообщить модератору
 Re: Быстрая вставка данных  [new]
Eleanor
Member

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

Спасибо, нашла таблицу для минимального логирования в 2016.
Хотя, ТС-у придется тестировать TF610 со своим 2008 R2.
19 июн 18, 19:15    [21504413]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить