|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
у меня задача сделать расчет данных из параметров одной витрины. Иными словами, я создаю множество сессий, каждая из которых забирает данные из витрины, делает обсчет и складывает их в свою #temp_table таким образом я получил множество таблиц #temp_table, которые должны быть в последствии объединены в одну на выход Код: sql 1. 2.
и это делает каждая сессия Таким образом, я получаю блокировку и очередь из сессий. Работает внушительно не быстро. Потому встал вопрос, можно ли сделать как-то вставку в целевую таблицу, без журналирования Спасибо всем ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 12:19 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
Двоичник у меня задача сделать расчет данных из параметров одной витрины. Иными словами, я создаю множество сессий, каждая из которых забирает данные из витрины, делает обсчет и складывает их в свою #temp_table таким образом я получил множество таблиц #temp_table, которые должны быть в последствии объединены в одну на выход Код: sql 1. 2.
и это делает каждая сессия Таким образом, я получаю блокировку и очередь из сессий. блокировку чего вы получаете? у каждой сессии своя #таблица узким местом могут быть только системные страницы файла tempdb, если он один что вернет запрос Код: sql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 12:26 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
komrad, Запрос вернул: Код: plaintext 1. 2.
авторблокировку чего вы получаете? У меня блокировка при вставке в таблицу insert into temp_table with(tablockx) каждая сессия вставляет данные из своей select * from #temp_table Но это происходит долго, вот и я и хочу отключить журналирование при вставке ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 12:43 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
Двоичник, 1. Секционируйте таблицу-приемник по признаку, который подразумевает то, что данные происходят из конкретной темповой таблицы. Например, если в одной темповой таблице у вас данные одного филиала, то ключом секционирования может быть, например, код филиала. 2. Заливку производите не непосредственно в целевую таблицу, а в рядомстоящую таблицу аналогичной структуры. 3. Производите пополнение целевой таблицы с помощью partition switch. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 12:47 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
Двоичник, 48 дата файлов в tempdb? впечатляет ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 12:52 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
komrad Двоичник, 48 дата файлов в tempdb? впечатляет Ну... если у него ядер 100 под рукой, то почему б и нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 12:55 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
да, 48 ядрён ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 12:59 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
uaggster Двоичник, 1. Секционируйте таблицу-приемник по признаку, который подразумевает то, что данные происходят из конкретной темповой таблицы. Например, если в одной темповой таблице у вас данные одного филиала, то ключом секционирования может быть, например, код филиала. 2. Заливку производите не непосредственно в целевую таблицу, а в рядомстоящую таблицу аналогичной структуры. 3. Производите пополнение целевой таблицы с помощью partition switch. Будьте любезны, расскажите подробнее, как это работает? Не сталкивался с таким соусом. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 13:01 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
uaggster komrad Двоичник, 48 дата файлов в tempdb? впечатляет Ну... если у него ядер 100 под рукой, то почему б и нет? теоретически - да а на практике подняться с рекомендуемых/стартовых 8 файлов до 48 - это сколько же надо итераций пройти и на каждой ловить блокировки на системных страницах https://docs.microsoft.com/en-US/troubleshoot/sql/performance/recommendations-reduce-allocation-contention где-то читал/слышал, что больше 16 файлов tempdb не дают какого-либо видимого эффекта но, безусловно, всегда есть место исключениям ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 13:05 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
нашел 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/ ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 13:20 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
Двоичник uaggster 2. Заливку производите не непосредственно в целевую таблицу, а в рядомстоящую таблицу аналогичной структуры. 3. Производите пополнение целевой таблицы с помощью partition switch. Будьте любезны, расскажите подробнее, как это работает? Не сталкивался с таким соусом. Спасибо https://sqlrus.com/2018/03/using-switch-on-a-single-partition/ ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 13:24 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
Двоичник 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/ А подробнее... Статью, что ли на хабр написать... Коллеги, имеет смысл, или если у уже дошел до этого, то самостоятельно освоение не составит труда? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 13:27 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
uaggster, конечно пишите.. молодежь будет куда отсылать.. да и самому на старости лет интересно, а все ли правильно в моих поделках. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 13:37 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
uaggster Двоичник, 1. Секционируйте таблицу-приемник по признаку, который подразумевает то, что данные происходят из конкретной темповой таблицы. Например, если в одной темповой таблице у вас данные одного филиала, то ключом секционирования может быть, например, код филиала. 2. Заливку производите не непосредственно в целевую таблицу, а в рядомстоящую таблицу аналогичной структуры. 3. Производите пополнение целевой таблицы с помощью partition switch. Лучше сразу начинать заколачивать гвозди сервером. Двоичник Код: sql 1. 2.
Потому встал вопрос, можно ли сделать как-то вставку в целевую таблицу, без журналирования Ну, почти, все правильно Код: sql 1. 2.
+ полное отсутствие ЛЮБЫХ индексов на таблице . Тогда, в теории, будет включено минимальное журналирование. https://docs.microsoft.com/ru-ru/sql/relational-databases/import-export/prerequisites-for-minimal-logging-in-bulk-import?view=sql-server-ver15 ЗЫ. Хотя херня у вас напроектирована неимоверная. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 14:28 |
|
INSERT без журналирования
|
|||
---|---|---|---|
#18+
Двоичник, в такой ситуации лучше использовать memory-optimized table. Получите неблокирующие вставки из множества сеансов, эти таблицы разработаны как раз зля таких сценариев. Однако, после добавления файловую группу уже нельзя удалить и базы и появится некоторые другие ограничения для базы. Так что тщательно взвесьте. Можно создать для вставок отдельную базу с оптимизацией для памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 21:34 |
|
|
start [/forum/topic.php?fid=46&fpage=6&tid=1683980]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 194ms |
0 / 0 |