Поведінка даних в індексах на основі коефіцієнта заповнення


14

Скажімо, у вас є база даних, де коефіцієнт заповнення за замовчуванням дорівнює 20. Щоразу, коли дані вставляються, вони створюють лише сторінки, заповнені до 20%?

Наскільки я розумію, коли дані будуть вставлені, на сторінках буде приблизно 20% даних. Коли дані оновлюються, однак вони розширяться до більш ніж 20% індексу, доповнивши їх заповненням та генеруючи розділення сторінки, правда?

Відповіді:


16

Коефіцієнт заповнення грає лише тоді, коли індекс створюється або відновлюється. Це кількість споживання для індексу сторінок рівня листків, які заповнюються під час цих операцій. ( Дивіться примітку нижче для більш роз'яснень на уражених рівнях сторінок )

Коли для даних ( INSERT, UPDATEта / або DELETE) є команда DML , це станеться з відповідними індексами. Іншими словами, якщо у вас на 20% заповнена сторінка, і ви вставляєте дані на цю сторінку, вона буде містити більше 20% даних (скажімо, 35% лише для прикладу). Зробіть ще одну вставку, тепер сторінка заповнена на 64%. Перебудуйте індекс, і сторінки на рівні аркушів тепер відносно будуть містити відсоток простору, який ви вказали (або неявно за замовчуванням для сервера).

( Зверніть увагу , коли ви не вказуєте PAD_INDEXбути ON, коефіцієнт заповнення застосовується лише до сторінок рівня аркуша. Але коли ви встановите PAD_INDEX = ON, коефіцієнт заповнення враховуватиметься для сторінок проміжного рівня індексу. За замовчуваннямOFF )

Причина коригування коефіцієнта заповнення (замість використання значень 100/0 за замовчуванням) полягає в тому, що ви мінімізуєте розбиття сторінок під час вставки чи оновлення даних. Але майте на увазі, нічого не безкоштовно. Чим менший коефіцієнт заповнення, тим більше місця займає звичайно. Якщо ви збережете 80% вільного простору сторінки для своїх індексів, вони будуть споживати відносно більшу кількість дискового простору, що може призвести до більшого читання.

Наскільки я розумію, коли дані будуть вставлені, на сторінках буде приблизно 20% даних. Коли дані оновлюються, однак вони розширяться до більш ніж 20% індексу, доповнивши їх заповненням та генеруючи розділення сторінки, правда?

Коли дані будуть вставлені, вони вставлятимуться у відповідні індекси на відповідній сторінці. Це могло б і, швидше за все, спричинити, що споживання сторінки буде перевищувати коефіцієнт заповнення.

Розкол сторінки відбудеться, коли нові дані будуть додані на повну індексну сторінку. Потім SQL Server розділить сторінку і приблизно розмістить половину даних з повної сторінки на новій. Знову ж таки, коефіцієнт заповнення тут не грає.

Законною причиною зниження коефіцієнта заповнення було б мінімізація розбиття сторінок, таким чином, мінімізація фрагментації сторінки індексу.


3
Це також мінімізує операції вводу-виводу, необхідні для вирощування або виділення місця.
JNK

Гаразд, тому я помилився з тим, як діяла поведінка. Дякую за таку детальну відповідь!
DForck42

1
@ DForck42 Немає проблем, радий допомогти.
Томас Стрінгер

Чи можемо ми підсумувати це, щоб сказати, що встановлення низького коефіцієнта заповнення буде, як правило, повільним читанням (більше сторінок), але швидкістю вставки (менше розбиття)?
Йон усіх торгів

2
@Jon: з високим показником fillfactor вказується фрагмент і читання сповільнюється. Для кожного індексу існує оптимальний коефіцієнт заповнення - над ним і під ним повільно пише і читає. Оптимальність залежить від моделей використання (скільки вставок на день), моделей обслуговування (як часто відбудовується), даних (наскільки унікальним є ключ). Не унікальні індекси, як правило, вимагають більше вільного місця (нижній коефіцієнт заповнення).
wqw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.