Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / INSERT WITH (TABLOCK) / 16 сообщений из 16, страница 1 из 1
27.12.2019, 16:47
    #39909184
assmsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
Всем, привет.
Прочитал на msdn что если делать insert с опцией tablock, то это ускоряет скорость вставки данных в таблицу за счет оптимизации ведения журнала транзакций.

Там речь идет о куче и из описания я не понял, ускоряет ли это вставку данных если таблица индексированная?

Код: sql
1.
2.
INSERT INTO TABLE_1 (ID,VAL) WITH (TABLOCK)
SELECT ID,VAL FROM TABLE_2
...
Рейтинг: 0 / 0
27.12.2019, 17:05
    #39909193
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
assmsk
Прочитал на msdn что если делать insert с опцией tablock, то это ускоряет скорость вставки данных в таблицу за счет оптимизации ведения журнала транзакций.

Там речь идет о куче и из описания я не понял, ускоряет ли это вставку данных если таблица индексированная?
Если есть индексы, то для использования минимального протоколирования нужно, что бы перед INSERT таблица была пустая

Если она непустая, но установлен флаг 610, то пишут, что минимальное протоколирование "возможно".

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/dd425070(v=sql.100)?redirectedfrom=MSDN
...
Рейтинг: 0 / 0
27.12.2019, 17:13
    #39909200
assmsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
alexeyvg
assmsk
Прочитал на msdn что если делать insert с опцией tablock, то это ускоряет скорость вставки данных в таблицу за счет оптимизации ведения журнала транзакций.

Там речь идет о куче и из описания я не понял, ускоряет ли это вставку данных если таблица индексированная?
Если есть индексы, то для использования минимального протоколирования нужно, что бы перед INSERT таблица была пустая

Если она непустая, но установлен флаг 610, то пишут, что минимальное протоколирование "возможно".

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/dd425070(v=sql.100)?redirectedfrom=MSDN



Те правильно я понимаю, что если я буду вставлять данные в пустую индексированную таблицу циклом с опцией tablock, то получу прирост в производительности только в 1ой итерации цикла, а со 2ой будет так же как и без tablock?
...
Рейтинг: 0 / 0
27.12.2019, 17:22
    #39909208
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
assmsk
Те правильно я понимаю, что если я буду вставлять данные в пустую индексированную таблицу циклом с опцией tablock, то получу прирост в производительности только в 1ой итерации цикла, а со 2ой будет так же как и без tablock?
Да.
...
Рейтинг: 0 / 0
27.12.2019, 17:29
    #39909218
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
assmsk,

если нет явных проблем с записью в журнал, например, мало памяти, медленные диски, то на глаз разницу не заметите. WITH (TABLOCK) даст выигрыш в объеме записи в журнал любом случае, даже если нет минимального протоколирования.
...
Рейтинг: 0 / 0
27.12.2019, 18:30
    #39909259
Remind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
Версия SQL Server'a какая? Начиная с 2016 сервер умеет делать parallel insert при указании TABLOCK
https://www.sqlshack.com/use-parallel-insert-sql-server-2016-improve-query-performance/
...
Рейтинг: 0 / 0
28.12.2019, 09:38
    #39909387
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
assmsk
Всем, привет.
Прочитал на msdn что если делать insert с опцией tablock, то это ускоряет скорость вставки данных в таблицу за счет оптимизации ведения журнала транзакций.

Там речь идет о куче и из описания я не понял, ускоряет ли это вставку данных если таблица индексированная?

Код: sql
1.
2.
INSERT INTO TABLE_1 (ID,VAL) WITH (TABLOCK)
SELECT ID,VAL FROM TABLE_2



Если таблица имеет кластерный индекс, то есть смысл отсортировать вставляемые данные в порядке этого ключа. В дополнение к TABLOCK
...
Рейтинг: 0 / 0
28.12.2019, 10:01
    #39909392
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
a_voronin
Если таблица имеет кластерный индекс, то есть смысл отсортировать вставляемые данные в порядке этого ключа.
Сиквел не так глуп и делает это самостоятельно.
...
Рейтинг: 0 / 0
28.12.2019, 21:12
    #39909494
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
Пора открывать раздел мифы & городские легенды SQL

Всех с наступающим!
...
Рейтинг: 0 / 0
29.12.2019, 12:30
    #39909562
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
Сортировка в некоторых случаях требуется для выполнения условий минимального протоколирования.
...
Рейтинг: 0 / 0
30.12.2019, 11:45
    #39909767
assmsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
alexeyvg
assmsk
Прочитал на msdn что если делать insert с опцией tablock, то это ускоряет скорость вставки данных в таблицу за счет оптимизации ведения журнала транзакций.

Там речь идет о куче и из описания я не понял, ускоряет ли это вставку данных если таблица индексированная?
Если есть индексы, то для использования минимального протоколирования нужно, что бы перед INSERT таблица была пустая

Если она непустая, но установлен флаг 610, то пишут, что минимальное протоколирование "возможно".

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/dd425070(v=sql.100)?redirectedfrom=MSDN



Те правильно я понимаю, что если я буду вставлять данные в пустую индексированную таблицу циклом с опцией tablock, то получу прирост в производительности только в 1ой итерации цикла, а со 2ой будет так же как и без tablock?
...
Рейтинг: 0 / 0
30.12.2019, 13:02
    #39909809
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
assmsk
alexeyvg
пропущено...
Если есть индексы, то для использования минимального протоколирования нужно, что бы перед INSERT таблица была пустая

Если она непустая, но установлен флаг 610, то пишут, что минимальное протоколирование "возможно".

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/dd425070(v=sql.100)?redirectedfrom=MSDN

Те правильно я понимаю, что если я буду вставлять данные в пустую индексированную таблицу циклом с опцией tablock, то получу прирост в производительности только в 1ой итерации цикла, а со 2ой будет так же как и без tablock?
Да, я же уже ответил "да" на этот вопрос :-)
alexeyvg
assmsk
Те правильно я понимаю, что если я буду вставлять данные в пустую индексированную таблицу циклом с опцией tablock, то получу прирост в производительности только в 1ой итерации цикла, а со 2ой будет так же как и без tablock?
Да.


Но, заметьте, что есть флаг 610, который позволит минимально логировать и в следующих итерациях.
...
Рейтинг: 0 / 0
30.12.2019, 13:18
    #39909823
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
Флаг 610 является устаревшим с 2014 или 2016 версии, точно не помню.
...
Рейтинг: 0 / 0
30.12.2019, 13:49
    #39909844
assmsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
alexeyvg,
случайно продублировал)
...
Рейтинг: 0 / 0
30.12.2019, 13:59
    #39909848
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
Владислав Колосов
Флаг 610 является устаревшим с 2014 или 2016 версии, точно не помню.
Спасибо, не знал про это.

https://docs.microsoft.com/ru-ru/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql?view=sql-server-ver15
Документация610 Управляет вставками с минимальным протоколированием в индексированные таблицы.
Этот флаг трассировки необязателен начиная с версии SQL Server 2016, поскольку минимальное протоколирование для индексированных таблиц включено по умолчанию.
В SQL Server 2016, когда операция массовой загрузки вызывает выделение новой страницы, все строки, последовательно заполняющие эту новую страницу, имеют минимальное протоколирование, если выполняются остальные необходимые условия для минимального протоколирования. Строки, вставляемые в существующие страницы (без выделения новой страницы) для сохранения порядка индексов, по-прежнему протоколируются полностью, как и строки, перемещенные в результате разбиения страницы во время загрузки.
Параметр ALLOW_PAGE_LOCKS должен иметь значение ON для индексов (указано по умолчанию), чтобы операция минимального протоколирования выполнялась, поскольку при выделении устанавливаются блокировки страниц, и протоколируются только выделения страниц или экстентов.

assmsk,
Значит, нужно руководствоваться этой таблицей:
...
Рейтинг: 0 / 0
30.12.2019, 14:02
    #39909850
u.eMeHTuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT WITH (TABLOCK)
Владислав Колосов
Флаг 610 является устаревшим с 2014 или 2016 версии, точно не помню.


С 2016
https://blogs.msdn.microsoft.com/sql_server_team/sql-server-2016-minimal-logging-and-impact-of-the-batchsize-in-bulk-load-operations/

интересная статья с тестами для более ранних версий:

https://orderbyselectnull.com/2017/07/10/trace-flag-610-and-sql-server-2016/
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / INSERT WITH (TABLOCK) / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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