Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Быстрая вставка данных / 17 сообщений из 17, страница 1 из 1
18.06.2018, 23:05
    #39662195
=Сергей=
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
MSSQL 2008 R2 (10.50.6000)
БД Recovery model: Simple
Есть хранимая процедура, в которой обрабатываются данные, которые заносятся в подготовленную временную таблицу (несколько миллионов записей):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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]. Больше никаких индексов нет.

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



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

Как можно сделать?
...
Рейтинг: 0 / 0
19.06.2018, 00:09
    #39662209
Slava_Nik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
убрать как минимум свойство identity(1,1) как минимум.
Что по вашему быстро и какие сейчас проблемы?
Может у вас просто проблемы с вводом\выводом, которое все тормозит
...
Рейтинг: 0 / 0
19.06.2018, 00:30
    #39662213
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
=Сергей=Работает приемлемо, но хочется быстрее.Что хочется быстрее, вставку в временную, или в большую таблицу?
Если второе, попробуйте вставку с минимальным логированием
Код: sql
1.
2.
insert into [big]([ID1],[ID2],[Type],[Count]) WITH (TABLOCK)
	select [ID1],[ID2],[Type],[Count] from #small
...
Рейтинг: 0 / 0
19.06.2018, 08:02
    #39662249
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
alexeyvg=Сергей=Работает приемлемо, но хочется быстрее.Что хочется быстрее, вставку в временную, или в большую таблицу?
Если второе, попробуйте вставку с минимальным логированием
Код: sql
1.
2.
insert into [big]([ID1],[ID2],[Type],[Count]) WITH (TABLOCK)
	select [ID1],[ID2],[Type],[Count] from #small




А где тут минимальное логирование?
...
Рейтинг: 0 / 0
19.06.2018, 08:03
    #39662250
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
alexeyvg=Сергей=Работает приемлемо, но хочется быстрее.Что хочется быстрее, вставку в временную, или в большую таблицу?
Если второе, попробуйте вставку с минимальным логированием
Код: sql
1.
2.
insert into [big]([ID1],[ID2],[Type],[Count]) WITH (TABLOCK)
	select [ID1],[ID2],[Type],[Count] from #small



Здесь только максимальное блокирование есть.
Совет то вредный...
...
Рейтинг: 0 / 0
19.06.2018, 08:13
    #39662251
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
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 другая история и к таблоку оно не имеет никакого отношения...
...
Рейтинг: 0 / 0
19.06.2018, 08:16
    #39662252
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
Щукина Анна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 другая история и к таблоку оно не имеет никакого отношения..."Слона-то я и не заметил..."(с)
Модель же симпл . Значит, единственное оставшееся ограничение - наличие кластерного индекса на целевой таблице...
...
Рейтинг: 0 / 0
19.06.2018, 10:00
    #39662301
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
...
Рейтинг: 0 / 0
19.06.2018, 10:42
    #39662320
=Сергей=
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
Друзья, большое спасибо за ответы.

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

Тогда, если я правильно понимаю, использование хинта TABLOCK будет накладывать блокировку на вставку из остальных подключений?
...
Рейтинг: 0 / 0
19.06.2018, 10:47
    #39662322
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
=Сергей=Тогда, если я правильно понимаю, использование хинта TABLOCK будет накладывать блокировку на вставку из остальных подключений?Предложенную статью читать лень?
...
Рейтинг: 0 / 0
19.06.2018, 13:25
    #39662436
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
=Сергей=Друзья, большое спасибо за ответы.

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

Тогда, если я правильно понимаю, использование хинта TABLOCK будет накладывать блокировку на вставку из остальных подключений?Да, т.к. у вас есть кластерный инедкс.
Но тут надо смотреть, может, один поток с минимальным логированием может быть быстрее, чем много потоков без него.
Ещё важно, что бы не использовалось сжатие.
...
Рейтинг: 0 / 0
19.06.2018, 13:53
    #39662462
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
alexeyvgДа, т.к. у вас есть кластерный инедкс.Тоже решили не читать статью?
...
Рейтинг: 0 / 0
19.06.2018, 16:37
    #39662558
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
invmalexeyvgДа, т.к. у вас есть кластерный инедкс.Тоже решили не читать статью?Эээ, читал, там для кластерного индекса написано "неконкурентный доступ", разве это не означает ответа на вопрос "Да, т.к. у вас есть кластерный инедкс."?
...
Рейтинг: 0 / 0
19.06.2018, 16:53
    #39662569
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
alexeyvgЭээ, читал, там для кластерного индекса написано "неконкурентный доступ"С TABLOCK да. А без и с TF 610 - конкурентный.
Или вы сугубо по TABLOCK отвечали? Тогда я Вас недопонял.
...
Рейтинг: 0 / 0
19.06.2018, 17:23
    #39662583
Eleanor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
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.
...
Рейтинг: 0 / 0
19.06.2018, 18:37
    #39662636
Col
Col
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
EleanorНо все флаги, как обычно, используйте на свой страх и риск:

Нет болл 610-го, почил в бозе.
В 2016-ом логика минимального логирования вклчена прямо из коробки.
...
Рейтинг: 0 / 0
19.06.2018, 19:15
    #39662654
Eleanor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрая вставка данных
Col,

Спасибо, нашла таблицу для минимального логирования в 2016.
Хотя, ТС-у придется тестировать TF610 со своим 2008 R2.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Быстрая вставка данных / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]