Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / INSERT без журналирования / 15 сообщений из 15, страница 1 из 1
24.12.2021, 12:19
    #40122687
Двоичник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
у меня задача сделать расчет данных из параметров одной витрины.
Иными словами, я создаю множество сессий, каждая из которых забирает данные из витрины, делает обсчет и складывает их в свою #temp_table
таким образом я получил множество таблиц #temp_table, которые должны быть в последствии объединены в одну на выход

Код: sql
1.
2.
insert into temp_table with(tablockx)
select * from #temp_table



и это делает каждая сессия

Таким образом, я получаю блокировку и очередь из сессий. Работает внушительно не быстро.

Потому встал вопрос, можно ли сделать как-то вставку в целевую таблицу, без журналирования

Спасибо всем
...
Рейтинг: 0 / 0
24.12.2021, 12:26
    #40122691
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
Двоичник
у меня задача сделать расчет данных из параметров одной витрины.
Иными словами, я создаю множество сессий, каждая из которых забирает данные из витрины, делает обсчет и складывает их в свою #temp_table
таким образом я получил множество таблиц #temp_table, которые должны быть в последствии объединены в одну на выход

Код: sql
1.
2.
insert into temp_table with(tablockx)
select * from #temp_table



и это делает каждая сессия

Таким образом, я получаю блокировку и очередь из сессий.


блокировку чего вы получаете?
у каждой сессии своя #таблица
узким местом могут быть только системные страницы файла tempdb, если он один

что вернет запрос
Код: sql
1.
select type_desc,count(1) from sys.master_files where database_id=2 group by type_desc


?
...
Рейтинг: 0 / 0
24.12.2021, 12:43
    #40122699
Двоичник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
komrad,
Запрос вернул:
Код: plaintext
1.
2.
type_desc	(Отсутствует имя столбца)
LOG	1
ROWS	48

авторблокировку чего вы получаете?
У меня блокировка при вставке в таблицу insert into temp_table with(tablockx)
каждая сессия вставляет данные из своей select * from #temp_table

Но это происходит долго, вот и я и хочу отключить журналирование при вставке
...
Рейтинг: 0 / 0
24.12.2021, 12:47
    #40122703
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
Двоичник,
1. Секционируйте таблицу-приемник по признаку, который подразумевает то, что данные происходят из конкретной темповой таблицы. Например, если в одной темповой таблице у вас данные одного филиала, то ключом секционирования может быть, например, код филиала.
2. Заливку производите не непосредственно в целевую таблицу, а в рядомстоящую таблицу аналогичной структуры.
3. Производите пополнение целевой таблицы с помощью partition switch.
...
Рейтинг: 0 / 0
24.12.2021, 12:52
    #40122706
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
Двоичник,

48 дата файлов в tempdb?

впечатляет
...
Рейтинг: 0 / 0
24.12.2021, 12:55
    #40122708
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
komrad
Двоичник,

48 дата файлов в tempdb?

впечатляет

Ну... если у него ядер 100 под рукой, то почему б и нет?
...
Рейтинг: 0 / 0
24.12.2021, 12:59
    #40122711
Двоичник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
да, 48 ядрён
...
Рейтинг: 0 / 0
24.12.2021, 13:01
    #40122713
Двоичник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
uaggster
Двоичник,
1. Секционируйте таблицу-приемник по признаку, который подразумевает то, что данные происходят из конкретной темповой таблицы. Например, если в одной темповой таблице у вас данные одного филиала, то ключом секционирования может быть, например, код филиала.
2. Заливку производите не непосредственно в целевую таблицу, а в рядомстоящую таблицу аналогичной структуры.
3. Производите пополнение целевой таблицы с помощью partition switch.


Будьте любезны, расскажите подробнее, как это работает? Не сталкивался с таким соусом.

Спасибо
...
Рейтинг: 0 / 0
24.12.2021, 13:05
    #40122714
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
uaggster
komrad
Двоичник,

48 дата файлов в tempdb?

впечатляет

Ну... если у него ядер 100 под рукой, то почему б и нет?


теоретически - да
а на практике подняться с рекомендуемых/стартовых 8 файлов до 48 - это сколько же надо итераций пройти и на каждой ловить блокировки на системных страницах

https://docs.microsoft.com/en-US/troubleshoot/sql/performance/recommendations-reduce-allocation-contention

где-то читал/слышал, что больше 16 файлов tempdb не дают какого-либо видимого эффекта
но, безусловно, всегда есть место исключениям
...
Рейтинг: 0 / 0
24.12.2021, 13:20
    #40122723
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
нашел
Paul RandallSo, why is one-to-one not always a good idea? Too many tempdb data files can cause performance problems for another reason. If you have a workload that uses query plan operators that require lots of memory (e.g. sorts), the odds are that there won’t be enough memory on the server to accommodate the operation, and it will spill out to tempdb. If there are too many tempdb data files, then the writing out of the temporarily-spilled data can be really slowed down while the allocation system does round-robin allocation. The same thing can happen with very large temp tables in tempdb too.

Why would round-robin allocation cause things to slow down for memory-spills to tempdb with a large number of files? A couple of possibilities:

- Round-robin allocation is per filegroup, and you can only have one filegroup in tempdb. With 16, 32, or more files in tempdb, and very large allocations happening from just a few threads, the extra synchronization and work necessary to do the round-robin allocation (looking at the allocation weightings for each file and deciding whether to allocate or decrement the weighting, plus quite frequently recalculating the weightings for all files – every 8192 allocations) starts to add up and become noticeable. It’s very different from lots of threads doing lots of small allocations. It’s also very different from allocating from a single-file filegroup – which is optimized (obviously) to not do round-robin.
- Your tempdb data files are not the same size and so the auto-grow is only growing a single file (the algorithm is unfortunately broken), leading to skewed usage and an I/O hotspot.
- Having too many files can lead to essentially random IO patterns when the buffer pool needs to free up space through the lazywriter (tempdb checkpoints don’t flush data pages) for systems with not very large buffer pools but *lots* of tempdb data. If the I/O subsystem can’t handle the load across multiple files, it will start to slow down.

I really need to do a benchmarking blog post to show what I mean – but in the mean time, I’ve heard this from multiple customers who’ve created large numbers of tempdb files, and I know this from how the code works (my dev team owned the allocation code).

https://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-1230-tempdb-should-always-have-one-data-file-per-processor-core/
...
Рейтинг: 0 / 0
24.12.2021, 13:24
    #40122725
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
Двоичник
uaggster


2. Заливку производите не непосредственно в целевую таблицу, а в рядомстоящую таблицу аналогичной структуры.
3. Производите пополнение целевой таблицы с помощью partition switch.


Будьте любезны, расскажите подробнее, как это работает? Не сталкивался с таким соусом.

Спасибо


https://sqlrus.com/2018/03/using-switch-on-a-single-partition/
...
Рейтинг: 0 / 0
24.12.2021, 13:27
    #40122726
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
Двоичник
uaggster
Двоичник,
1. Секционируйте таблицу-приемник по признаку, который подразумевает то, что данные происходят из конкретной темповой таблицы. Например, если в одной темповой таблице у вас данные одного филиала, то ключом секционирования может быть, например, код филиала.
2. Заливку производите не непосредственно в целевую таблицу, а в рядомстоящую таблицу аналогичной структуры.
3. Производите пополнение целевой таблицы с помощью partition switch.


Будьте любезны, расскажите подробнее, как это работает? Не сталкивался с таким соусом.

Спасибо

Гм... Ну, для первичного ознакомления могу порекомендовать:
https://database.guide/switch-out-a-partition-in-sql-server-t-sql/
https://www.cathrinewilhelmsen.net/table-partitioning-in-sql-server-partition-switching/

А подробнее... Статью, что ли на хабр написать...
Коллеги, имеет смысл, или если у уже дошел до этого, то самостоятельно освоение не составит труда? :-)
...
Рейтинг: 0 / 0
24.12.2021, 13:37
    #40122730
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
uaggster,

конечно пишите.. молодежь будет куда отсылать.. да и самому на старости лет интересно, а все ли правильно в моих поделках.
...
Рейтинг: 0 / 0
24.12.2021, 14:28
    #40122749
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
uaggster
Двоичник,
1. Секционируйте таблицу-приемник по признаку, который подразумевает то, что данные происходят из конкретной темповой таблицы. Например, если в одной темповой таблице у вас данные одного филиала, то ключом секционирования может быть, например, код филиала.
2. Заливку производите не непосредственно в целевую таблицу, а в рядомстоящую таблицу аналогичной структуры.
3. Производите пополнение целевой таблицы с помощью partition switch.


Лучше сразу начинать заколачивать гвозди сервером.
Двоичник

Код: sql
1.
2.
insert into temp_table with(tablockx)
select * from #temp_table


Потому встал вопрос, можно ли сделать как-то вставку в целевую таблицу, без журналирования


Ну, почти, все правильно
Код: sql
1.
2.
insert into temp_table with(tablockx)
select * from #temp_table


+ полное отсутствие ЛЮБЫХ индексов на таблице .
Тогда, в теории, будет включено минимальное журналирование.

https://docs.microsoft.com/ru-ru/sql/relational-databases/import-export/prerequisites-for-minimal-logging-in-bulk-import?view=sql-server-ver15


ЗЫ. Хотя херня у вас напроектирована неимоверная.
...
Рейтинг: 0 / 0
24.12.2021, 21:34
    #40122883
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT без журналирования
Двоичник,

в такой ситуации лучше использовать memory-optimized table. Получите неблокирующие вставки из множества сеансов, эти таблицы разработаны как раз зля таких сценариев. Однако, после добавления файловую группу уже нельзя удалить и базы и появится некоторые другие ограничения для базы. Так что тщательно взвесьте. Можно создать для вставок отдельную базу с оптимизацией для памяти.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / INSERT без журналирования / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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