|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
Приветствую всех! Прошу поделиться опытом и своими соображениями. По данным sp_spaceused в базе несколько таблиц с большим размером unused space (до 2/3 всего размера таблицы). Таблицы большие (20 ГБ), кластеризованные, не кластерных индексов нет, столбцы не удалялись, var* полей нет, записи НЕ удаляются, только добавляются (BULK INSERT'ом) и редко обновляются. Значение sys.dm_db_index_physical_stats.avg_page_space_used_in_percent близко к 100, то есть страницы заполнены почти полностью, sys.allocation_units показывает большое количество неиспользуемых страниц, а в sys.dm_db_database_page_allocations (DBCC IND) видно, что в большинстве экстентов заняты только 1-2 страницы (из 8). Почему это может происходить и можно ли это исправить? rows reserved data index_size unused 147320591 21309072 KB 7742560 KB 33848 KB 13532664 KB 718730165 26862544 KB 14615112 KB 70040 KB 12177392 KB 686030416 27038328 KB 14857064 KB 71584 KB 12109680 KB 284819036 20882944 KB 6692912 KB 31464 KB 14158568 KB Структура одной из таблиц: [int, int] (PK), tinyint, tinyint ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2020, 09:54 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
John Black, A large amount of unused space could be a symptom if using bulk insert with a small batch size. See http://www.dbdelta.com/bulk-load-batch-size-considerations-in-sql-server-2016/. https://social.msdn.microsoft.com/Forums/sqlserver/en-US/e816b6cb-07ce-469b-9567-eec6f0100239/unused-reserved-space-of-table-too-big?forum=sqldatabaseengine ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2020, 09:58 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
a_voronin, Спасибо! А если вставка выполняется не по порядку кластерного ключа (то есть записи из пакета нужно распихивать в разные места кластерного индекса), то место также выделяется целыми экстентами? Как это происходит? Сервер находит место в индексе куда нужно вставить запись, выделяет целый новый экстент и вставляет туда одну запись (или несколько отсортированных из пакета)? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2020, 10:28 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
John Black А если вставка выполняется не по порядку кластерного ключа (то есть записи из пакета нужно распихивать в разные места кластерного индекса), то место также выделяется целыми экстентами? жирно было бы экстентами. вставка будет идти в нужную страницу, пока та не заполнится, когда не полезет, выделится новая страница и туда переместится половина данных со старой. т.е. вместо 1 страницы теперь 2, заполненные наполовину. гуглите на split page. ...прежде чрм разбираться со своим пустым местом, неплохо бы посмотреть fill factor этого индекса. тот, кому не нужны сплиты (это дорого и медленно), и кто в курсе, что вставка идет совсем не по порядку ключа, выставляет индексу нужный ff. а очередной ребилд оставит в индексе свободное место согласно этому ff ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2020, 10:45 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
Yasha123, Видимо при пакетной вставке механизм меняется (как написано по ссылкам приведённым a_voronin). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2020, 11:36 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
John Black, экстент выделяется при больших размерах таблицы. Для маленьких таблиц - страницы. Если я правильно помню. Что-то такое было в статьях у Дмитрия Пилюгина. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2020, 13:10 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
Вы зачтите сначала ссылку SQL Server 2016 and later improves performance further by turning on bulk load context and minimal logging by default when bulk loading into SIMPLE and BULK LOGGED recovery model databases, which previously required turning on trace flags as detailed in this blog post by Parikshit Savjani of the MSSQL Tiger team. That post also includes links to other great resources that thoroughly cover minimal logging and data loading performance, which I recommend you peruse if you use bulk load often. I won’t repeat all that information here but do want to call attention to the fact that these new bulk load optimizations can result in much more unused space when a small batch size is used compared to SQL Server 2014 and older versions. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2020, 13:16 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
зачитали. у меня 2014. что у ТС без понятия, он не считает нужным сообщить. так что каждый про свое. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2020, 14:34 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
Yasha123 зачитали. у меня 2014. что у ТС без понятия, он не считает нужным сообщить. так что каждый про свое. Наверное, у ТС всё таки булк делается с минимальным логированием, соответственно, будет такой эффект. Я помню, это всегда было так. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2020, 17:45 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
alexeyvg Yasha123 зачитали. у меня 2014. что у ТС без понятия, он не считает нужным сообщить. так что каждый про свое. Наверное, у ТС всё таки булк делается с минимальным логированием, соответственно, будет такой эффект. Я помню, это всегда было так. да фига ли у предыдущих так же. таблок не напишешь и уже идет построчное логирование с такой же вставкой. или индекс кроме кластерного. у меня туча балков, таблицы индексированы до кучи, блокировать монопольно тоже невозможно. все полностью логируется в простой модели и никаких дыр не наблюдаю ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2020, 17:55 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
Версия сервера 2016. Насчёт минимального протоколирования точно не знаю используется ли оно - в разных источниках разные условия для его использования, у меня простая модель восстановления, TABLOCK не используется, таблица класстернаяя, но не пустая, других индексов нет. Минимальное протоколирование меня не сильно волнует, поскольку записи маленькие и пакеты небольшие. Так может даже лучше в журнал транзакций писать, чем выполнять принудительное сбрасывание страниц при фиксации транзакции. Главное, что я нашёл по ссылкам, это: "Bulk Load Batch Size Implications An important consideration in SQL 2016 and later with bulk load context and minimal logging is that each batch allocates new extent(s) (8 contiguous 8K pages, 64K) rather than using existing unused pages in existing extents." Судя по обилию почти пустых экстентов, в моём случае это и происходит. Покапаю в этом направлении, послежу за выделением места при вставке. Ещё попробую флаг 692 и поговорю с разработчиками софта об увеличении размера пакетов при вставке. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2020, 05:59 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
Провёл эксперимент. Создал кластерную таблицу с тестовыми данными на 9 страниц (чтобы перейти на использование однородных экстентов). При выполнении BULK INSERT (маленький пакет 1 КБ), когда требуется добавить страницу, сразу выделяется новый экстент. При включении флага 692 новая страница выделяется в одном из уже выделенных экстентов. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2020, 12:20 |
|
Unused space кластерных таблиц
|
|||
---|---|---|---|
#18+
John Black, В проде не рекомендуют пользоваться флагами трассировки, можно не использовать tablock, чтобы контекст массовой загрузки не использовался, выше уже писали об этом источнике ттынц ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 03:24 |
|
|
start [/forum/topic.php?fid=46&msg=39931492&tid=1686387]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 154ms |
0 / 0 |