Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Структура организации некластеризованного индекса.  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
В теории все понятно. Есть B-дерево, есть страница величиной 8096(или 8060 так точно и не понял, везде по-разному).И на конечном уровне хранится или ключ кластерного индекса или RID.

Теперь на практике:
USE AdventureWorks

CREATE TABLE [dbo].[Test]( [id] [int] NULL)
CREATE NONCLUSTERED INDEX [IX_id] ON [dbo].[Test] ([id] ASC)

set nocount on
declare @id int
set @id = 1
WHILE @id<=449
begin
	insert into dbo.Test select @id
	set @id = @id + 1
end
set nocount off

ALTER INDEX [IX_id] ON [dbo].[Test] REBUILD 

select * FROM
sys.dm_db_index_physical_stats(DB_ID('AdventureWorks'),OBJECT_ID('dbo.Test'),2,NULL,'DETAILED')

insert into dbo.Test select 100
ALTER INDEX [IX_id] ON [dbo].[Test] REBUILD 

select * FROM
sys.dm_db_index_physical_stats(DB_ID('AdventureWorks'),OBJECT_ID('dbo.Test'),2,NULL,'DETAILED')

Таким образом получается, что когда в таблице 449 записей, то весь индекс умещается на одной странице. При этом не понятно, как трактовать колонку record_size_in_bytes.
Потом при добавлении одной строки, индекс начинает состоять из корневой страницы и двух страниц конечного кровня. При этом record_size_in_bytes у корневой страницы 22, а у конечной - 16.
Собственно хотелось бы в общем прояснить эту ситуацию ну и конкретнро получить ответы на следующие вопросы:
1) Страницы индекса имеют размер 8096 или 8060.
2)Что именно хранится на конечном уровне не кластеризованного индекса, что на страницу в 8096 влезает 449 записи(для моей таблицы).
3)Как трактовать поля record_size_in_bytes в представлении sys.dm_db_index_physical_stats.
4)Что хранится на промежуточном уровне В-дерева?
5)Как подсчитать, при каком количестве записей, дерево станет трех уровнем.
(у меня получилось при 151314)
19 ноя 09, 11:26    [7949348]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33348
Блог
Страницы - 8кб, из них "полезного" месте - 8060 байт
19 ноя 09, 12:17    [7949854]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33348
Блог
449 записей хранятся на одной странице, так как максимальное число строк данных или индекса для одной страницы равно 8060, деленному на размер одной строки данных или индекса.
19 ноя 09, 12:22    [7949898]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Критик
Страницы - 8кб, из них "полезного" месте - 8060 байт

Да, а вот тут написано по-другому:
http://msdn.microsoft.com/en-us/library/aa964133(SQL.90).aspx
All pages, including non-leaf index pages, have a size of 8192 bytes, including 96 bytes occupied by the header—this leaves 8096 bytes for the index data.

Обманывают получается?
19 ноя 09, 12:24    [7949911]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Критик
449 записей хранятся на одной странице, так как максимальное число строк данных или индекса для одной страницы равно 8060, деленному на размер одной строки данных или индекса.


Ну так и чему тут равен размер одной строки индекса?i
nt - 4 байта. 4 * 449 = 1796. Никак не 8060.
19 ноя 09, 12:26    [7949937]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
ПО размеру страницы вот нашел объяснение нормальное:
Sorry, I should just clarify, the page size is 8192 bytes (8KB) of which
8060 bytes are available for data. The remainder of each page is used
by a 96 byte page header & the row offset array (which goes backwards
from the end of the page). In fact, it would be even more accurate to
say of the 8192 bytes on each page, 96 bytes is taken by the page header
and the remaining 8096 bytes is available for data + row offset array.
But it's all fairly academic really...
19 ноя 09, 13:07    [7950300]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Ну так и чему тут равен размер одной строки индекса?
> int - 4 байта. 4 * 449 = 1796. Никак не 8060.

ну щаз - 4 байта.
4 байта - собственно int
+ 1 статусный байт (TagA)
+ 8 байт RID (4 для номера страницы и по 2 для номера файла и слота)
+ 2 байта для хранения количества столбцов
+ 1 байт NULL-bitmap

итого, имеем те самые 16 байт.

+ не забудем про два байта на строку в row offset array. это уже будет 18.

соответственно, получаем 18*449 = 8082

страница 8 килобайт = 8192 - 96 (хидер) = 8096

остается 8096 - 8082 = 14 байт, которых на еще одну стоку уже не хватает.

Posted via ActualForum NNTP Server 1.4

19 ноя 09, 13:12    [7950341]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
daw,
О, спасибо, самый кайф !!!
Остался только один вопрос не решенный. Чем заполняется страница на промежуточном уровне дерева и сколько туда влезает записей.
19 ноя 09, 13:21    [7950434]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Хотя не понятно с этим row offset array.
В доке же написано что он в конце странитцы находится. А вы почему то его к каждой строке прибавили, да еще и 2 байта целых.
И record_size_in_bytes на конечном уровне 16 байт, а не 18.
Ситуация конечно прояснилась, спасибо, но вопросы все равно остаются.
19 ноя 09, 13:27    [7950483]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Остался только один вопрос не решенный. Чем заполняется страница на
> промежуточном уровне дерева и сколько туда влезает записей.

все то же самое + 6 байт для указателя на страницу на нижнем уровне
(4 - номер страницы + 2 номер файла).

Posted via ActualForum NNTP Server 1.4

19 ноя 09, 13:29    [7950510]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> В доке же написано что он в конце странитцы находится. А вы почему то
> его к каждой строке прибавили, да еще и 2 байта целых.
> И record_size_in_bytes на конечном уровне 16 байт, а не 18.
> Ситуация конечно прояснилась, спасибо, но вопросы все равно остаются.

все правильно - в конце. но у него не фиксированный размер. он как бы
растет снизу страницы - по 2 байта на каждый слот. поэтому, чтобы
рассчитать, сколько строк может поместиться на странице, к размеру
собственно строки надо добавлять еще 2 байта для row offset array.

Posted via ActualForum NNTP Server 1.4

19 ноя 09, 13:31    [7950523]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Все, теперь все встало на свои места.
Последнее, где вы про это прочитали? ))
19 ноя 09, 13:33    [7950542]     Ответить | Цитировать Сообщить модератору
 Re: Структура организации некластеризованного индекса.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Все, теперь все встало на свои места.
> Последнее, где вы про это прочитали? ))

у тети Кэлен (Kalen Delaney), понятное дело. :)
Inside Microsoft SQL Server 2005: The Storage Engine
там все подробно разжевано: с картинками, с примерами, которые запустить
можно и самому посмотреть на страницы.

Posted via ActualForum NNTP Server 1.4

19 ноя 09, 13:39    [7950593]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить