Разделение страницы вызвано обновлением столбца Binary(128)
У меня есть таблица с двоичным (128) столбцом. Я выбрал Binary(128) вместо Varbinary(128), чтобы он зарезервировал все 128 байтов и предотвратил разбиение страницы при обновлении двоичного значения. Для целей тестирования у меня есть индекс FILLFACTOR 100 в моем индексе.
Я обнаружил, что даже если для столбца установлено значение Binary(128), это все равно будет вызывать разбиение страницы при обновлении этого столбца.
У кого-нибудь есть идеи, почему?
Вот код для тестирования...
-- Create working dataset
Create Table TestTable (tID Int Identity, TestBinary Binary(128));
Create Clustered Index hmmmm On TestTable (TestBinary) With (FillFactor=100);
With recur As
(
Select Convert(Binary(128),0x01) As val, 1 As incr
Union All
Select Convert(Binary(128),incr + 0x01), incr + 1
From recur
Where incr < 100
)
Insert TestTable (TestBinary)
Select Convert(Binary(128),Convert(Int,r.val) + Convert(Int,r2.val) + Convert(Int,r3.val)) As TestBinary
From recur r
Cross Join recur r2
Cross Join recur r3;
-- Rebuild Index as needed while testing
Alter Index [hmmmm] On [dbo].[TestTable] Rebuild
-- Check index fragmentation
SELECT Db_Name() As DatabaseName,
o.id,
s.name,
o.name,
page_count,
record_count,
index_type_desc,
index_id,
index_depth,
index_level,
avg_fragmentation_in_percent,
fragment_count,
avg_fragment_size_in_pages,
avg_page_space_used_in_percent
From sys.dm_db_index_physical_stats (DB_ID(), Object_ID('dbo.TestTable'), NULL , NULL, 'Detailed') n
Join sysobjects o
On n.object_id = o.id
Join sys.schemas s
On o.uid = s.schema_id;
-- Update the records
Update t
Set TestBinary = Convert(Binary(128),(Convert(Int,TestBinary) + 10000))
From TestTable t
Если вы выполняете большое обновление с FILLFACTOR на 100, это вызывает серьезную фрагментацию, но если у меня FILLFACTOR на 90, все хорошо. Я думал, что типы данных non-var должны были зарезервировать память, поэтому вы не столкнетесь с этой проблемой. Откуда исходит инфляция при хранении?
Спасибо!
1 ответ
Это может быть не инфляция, а скорее движение. Поскольку вы создали кластерный индекс для вашего двоичного столбца (128), данные будут отсортированы в соответствии со значением.
Когда вы обновляете значение, физическая запись может быть сохранена на другой странице, чтобы поддерживать порядок. Если эта другая страница заполнена, ее придется разделить.