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

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

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

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

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

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

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

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

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

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

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


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