Рассмотрим индекс B-дерева для значения, которое всегда будет монотонно увеличиваться, например столбец типа IDENTITY. В обычной реализации B-дерева, когда узел заполнен, он будет разделен на 50% / 50%, и мы получим B-дерево, в котором (почти) все узлы будут заполнены только на 50%.
Я знаю, что Oracle обнаруживает, когда значение постоянно увеличивается, и в этих случаях Oracle выполняет разделение на 90% / 10%. Таким образом, (почти) все узлы будут заполнены на 90%, и в этих, довольно распространенных случаях достигается гораздо лучшее использование страниц.
Мне не удалось найти документацию для аналогичной функции в SQL Server. Однако я провел два эксперимента, в которых я вставил в индекс N случайных целых чисел и N последовательных целых чисел соответственно. В первом случае использовалось гораздо больше страниц, во втором.
Предоставляет ли SQL Server аналогичную функциональность? Если да, то можете ли вы указать мне некоторую документацию по этой функции?
ОБНОВЛЕНИЕ: Кажется, согласно экспериментам, представленным ниже, листовые узлы остаются неразделенными, а внутренние узлы делятся на 50% / 50%. Это делает B-деревья на увеличивающихся ключах более компактными, чем на случайных ключах. Тем не менее, подход Oracle на 90% / 10% еще лучше, и я все еще ищу некоторую официальную документацию, которая может проверить поведение, наблюдаемое в экспериментах.
источник
Ответы:
Если он добавляет строку в конец индекса, он просто выделит новую страницу для строки, а не разделит текущую конечную страницу. Экспериментальное подтверждение этому приведено ниже (используется
%%physloc%%
функция, которая требует SQL Server 2008). Смотрите также обсуждение здесь .Возвращает (Ваши результаты будут отличаться)
Это, кажется, применимо только к конечным узлам. Это можно увидеть, запустив нижеприведенное и отрегулировав
TOP
значение. Для меня622/623
была точка отсечения между требованием одной и двух страниц первого уровня (может отличаться, если у вас включена изоляция снимка?). Это делит страницу сбалансированным образом, что приводит к потере места на этом уровне.источник
PRIMARY KEY
.DBCC IND
и,sys.dm_db_index_physical_stats
чтобы увидеть информацию о них.