powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / INSERT без журналирования
15 сообщений из 15, страница 1 из 1
INSERT без журналирования
    #40122687
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня задача сделать расчет данных из параметров одной витрины.
Иными словами, я создаю множество сессий, каждая из которых забирает данные из витрины, делает обсчет и складывает их в свою #temp_table
таким образом я получил множество таблиц #temp_table, которые должны быть в последствии объединены в одну на выход

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



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

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

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

Спасибо всем
...
Рейтинг: 0 / 0
INSERT без журналирования
    #40122691
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
у меня задача сделать расчет данных из параметров одной витрины.
Иными словами, я создаю множество сессий, каждая из которых забирает данные из витрины, делает обсчет и складывает их в свою #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
INSERT без журналирования
    #40122699
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad,
Запрос вернул:
Код: plaintext
1.
2.
type_desc	(Отсутствует имя столбца)
LOG	1
ROWS	48

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

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

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

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

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

впечатляет

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


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

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

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

впечатляет

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


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

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

где-то читал/слышал, что больше 16 файлов tempdb не дают какого-либо видимого эффекта
но, безусловно, всегда есть место исключениям
...
Рейтинг: 0 / 0
INSERT без журналирования
    #40122723
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел
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
INSERT без журналирования
    #40122725
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
uaggster


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


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

Спасибо


https://sqlrus.com/2018/03/using-switch-on-a-single-partition/
...
Рейтинг: 0 / 0
INSERT без журналирования
    #40122726
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Двоичник
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
INSERT без журналирования
    #40122730
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

конечно пишите.. молодежь будет куда отсылать.. да и самому на старости лет интересно, а все ли правильно в моих поделках.
...
Рейтинг: 0 / 0
INSERT без журналирования
    #40122749
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
INSERT без журналирования
    #40122883
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник,

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


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