powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Unused space кластерных таблиц
13 сообщений из 13, страница 1 из 1
Unused space кластерных таблиц
    #39931460
John Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую всех! Прошу поделиться опытом и своими соображениями.

По данным 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
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39931466
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39931492
John Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin,

Спасибо! А если вставка выполняется не по порядку кластерного ключа (то есть записи из пакета нужно распихивать в разные места кластерного индекса), то место также выделяется целыми экстентами? Как это происходит? Сервер находит место в индексе куда нужно вставить запись, выделяет целый новый экстент и вставляет туда одну запись (или несколько отсортированных из пакета)?
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39931514
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
John Black
А если вставка выполняется не по порядку кластерного ключа (то есть записи из пакета нужно распихивать в разные места кластерного индекса), то место также выделяется целыми экстентами?

жирно было бы экстентами.
вставка будет идти в нужную страницу, пока та не заполнится,
когда не полезет, выделится новая страница и туда переместится половина данных со старой.
т.е. вместо 1 страницы теперь 2, заполненные наполовину.
гуглите на split page.

...прежде чрм разбираться со своим пустым местом, неплохо бы посмотреть fill factor этого индекса.
тот, кому не нужны сплиты (это дорого и медленно),
и кто в курсе, что вставка идет совсем не по порядку ключа,
выставляет индексу нужный ff.
а очередной ребилд оставит в индексе свободное место согласно этому ff
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39931549
John Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yasha123,

Видимо при пакетной вставке механизм меняется (как написано по ссылкам приведённым a_voronin).
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39931649
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
John Black,

экстент выделяется при больших размерах таблицы. Для маленьких таблиц - страницы. Если я правильно помню. Что-то такое было в статьях у Дмитрия Пилюгина.
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39931656
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы зачтите сначала ссылку

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.
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39931717
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачитали.
у меня 2014.
что у ТС без понятия, он не считает нужным сообщить.
так что каждый про свое.
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39931900
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123
зачитали.
у меня 2014.
что у ТС без понятия, он не считает нужным сообщить.
так что каждый про свое.
Так у предыдущих так же, только в предыдущих для "improves performance further by turning on bulk load context and minimal logging" нужно было выполнить больше условий, в. т.ч. иногда включить трейс-флаг.

Наверное, у ТС всё таки булк делается с минимальным логированием, соответственно, будет такой эффект. Я помню, это всегда было так.
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39931906
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Yasha123
зачитали.
у меня 2014.
что у ТС без понятия, он не считает нужным сообщить.
так что каждый про свое.
Так у предыдущих так же, только в предыдущих для "improves performance further by turning on bulk load context and minimal logging" нужно было выполнить больше условий, в. т.ч. иногда включить трейс-флаг.

Наверное, у ТС всё таки булк делается с минимальным логированием, соответственно, будет такой эффект. Я помню, это всегда было так.

да фига ли у предыдущих так же.
таблок не напишешь и уже идет построчное логирование с такой же вставкой.
или индекс кроме кластерного.
у меня туча балков, таблицы индексированы до кучи, блокировать монопольно тоже невозможно.
все полностью логируется в простой модели и никаких дыр не наблюдаю
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39932041
John Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия сервера 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 и поговорю с разработчиками софта об увеличении размера пакетов при вставке.
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39932121
John Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Провёл эксперимент. Создал кластерную таблицу с тестовыми данными на 9 страниц (чтобы перейти на использование однородных экстентов). При выполнении BULK INSERT (маленький пакет 1 КБ), когда требуется добавить страницу, сразу выделяется новый экстент. При включении флага 692 новая страница выделяется в одном из уже выделенных экстентов.
...
Рейтинг: 0 / 0
Unused space кластерных таблиц
    #39933819
John Black,
В проде не рекомендуют пользоваться флагами трассировки, можно не использовать tablock, чтобы контекст массовой загрузки не использовался, выше уже писали об этом источнике
ттынц
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Unused space кластерных таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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