|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
До сих пор не могу поверить, что кластерный индекс, определенный для ОДНОГО из столбцов таблицы, хранит внутри себя данные других столбцов любых типов. Может кто-нибудь кинет в меня ссылкой на нормальную статью (желательно на русском), где четко объяснено: что именно хранится в кластерном индексе и как устроено его дерево? Заранее благодарю. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2005, 14:23 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
AloisДо сих пор не могу поверить, что кластерный индекс, определенный для ОДНОГО из столбцов таблицы, хранит внутри себя данные других столбцов любых типов. Может кто-нибудь кинет в меня ссылкой на нормальную статью (желательно на русском), где четко объяснено: что именно хранится в кластерном индексе и как устроено его дерево? Заранее благодарю. на самом деле он ничего не хранит в смысле дублирования просто корневые страницы этого кластерного индекса и есть сама таблица ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2005, 14:32 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
2 tpg Спасибо. Навскидку: дельная статья с множеством деталей, не встречавшихся мне в других местах. Буду изучать. ОЧЕНЬ редко удавалось использовать кластерный индекс для несправочных таблиц, чтобы повысить общее быстродействие. Всегда найдутся запросы, которым этот индекс мешает. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2005, 14:40 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
Прочитал статью. Вопросы остались. Например, есть таблица Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
В таблице есть поле типа char(7000). Сервер в случае последнего INSERTa будет страницы сплиттить? Как я понял, данные всех полей находятся рядом на страницах. Иначе никакой разницы между кластерным и некластерным индексом нет. Оба типа на своих страницах содержат закладки на страницы с данными. Если не трудно, поясните, плиз. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2005, 15:44 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
Может уважаемый Glory подскажет? Вопрос для меня очень важный для понимания устрйства хранилища данных. Даже в указанной tpg статье на картике показано расположение данных только индексированных полей. Где располагаются остальные? Как привязаны к индексу? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2005, 17:20 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
хотите посмотреть что будет - DBCC PAGE вам в руки ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2005, 17:29 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
Даже в указанной tpg статье на картике показано расположение данных только индексированных полей. Где располагаются остальные? Как привязаны к индексу? Слева/справа на картинке надписано что есть что - INDEX/DATA ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2005, 17:35 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
2 Glory. Давайте конкретнее. Из рис.3 я не вижу, где расположены значения полей, например, ContactTitle или Phone или Fax? Зато рисунок 2 для некластерного индекса всё прекрасно объясняет. 2 Anton. Видать, придется самому копать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2005, 18:38 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
Alois2 Glory. Давайте конкретнее. Из рис.3 я не вижу, где расположены значения полей, например, ContactTitle или Phone или Fax? На рис.3 у нижнего ряда кубиков слева написано DATA что означает что это страницы данных У верхнего ряда кубиков справа написано INDEX что означает что это страницы индекса. AloisЗато рисунок 2 для некластерного индекса всё прекрасно объясняет. Для некластерного индекса нужно смотреть рисунки 5 и 6 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2005, 19:43 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
http://blogs.gotdotnet.ru/personal/Bezzus/CommentView.aspx?guid=2ec662e4-9179-4663-8034-3f54bf198db9 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2005, 23:45 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
2 KRS544. Я натыкался на эту страницу, но так и несмог ее прочитать. Перебрал все настроенные у меня кодировки, но увы. 2 Glory авторНа рис.3 у нижнего ряда кубиков слева написано DATA что означает что это страницы данных У верхнего ряда кубиков справа написано INDEX что означает что это страницы индекса. Даже обидно выслушивать такие комментарии. Это было понятно с самого начала. Вопрос не в этом. А вот в чем. Страницы с данными я вляются листьями кластерного индекса. Но они упорядочены по индексируемому полю. В примере из моего поста 1469029 строка занимает 7008 байтов. Допустим строковое поле занимает 1000 байтов. тогда на странице данных влезет 7 строк. Вопрос: при вставке (в примере это последний ИНСЕРТ) строки серверу придется создавать новую страницу и ФИЗИЧЕСКИ перемещать строку с ID=3 на другую страницу. После чего на страницах промежуточного уровня заново сортировать данные, возможно опять с разбивкой страниц. Верно? Это же до фига работы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 10:01 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
Даже обидно выслушивать такие комментарии. Это было понятно с самого начала. Ну извините. Значит я не так понял ваш вопрос Вопрос: при вставке (в примере это последний ИНСЕРТ) строки серверу придется создавать новую страницу и ФИЗИЧЕСКИ перемещать строку с ID=3 на другую страницу. После чего на страницах промежуточного уровня заново сортировать данные, возможно опять с разбивкой страниц. Верно? Если на индексной странице нет места то да, придется. Только расщепление пойдет сверху вниз а не снизу вверх. Но наличие места на индексной странице регулируется fill factor индекса. И даже при fill factor 100% при создании индекса на индексной странице всегда резервируется одно свободное место. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 10:17 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
У вас и так каждая строка на отдельной странице хранится. При вставке новой строки будет создана новая страница, добавлены в нее данные, а уровнем выше будет добавлена всего одна запись, указывающая на эту страницу ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 10:19 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
Alois2 KRS544. Я натыкался на эту страницу, но так и несмог ее прочитать. Перебрал все настроенные у меня кодировки, но увы. 2 Glory авторНа рис.3 у нижнего ряда кубиков слева написано DATA что означает что это страницы данных У верхнего ряда кубиков справа написано INDEX что означает что это страницы индекса. Даже обидно выслушивать такие комментарии. Это было понятно с самого начала. Вопрос не в этом. А вот в чем. Страницы с данными я вляются листьями кластерного индекса. Но они упорядочены по индексируемому полю. В примере из моего поста 1469029 строка занимает 7008 байтов. Допустим строковое поле занимает 1000 байтов. тогда на странице данных влезет 7 строк. Вопрос: при вставке (в примере это последний ИНСЕРТ) строки серверу придется создавать новую страницу и ФИЗИЧЕСКИ перемещать строку с ID=3 на другую страницу. После чего на страницах промежуточного уровня заново сортировать данные, возможно опять с разбивкой страниц. Верно? Это же до фига работы. Нет не верно.. Сервер помещает в этом случае в страницы данных ссылку на новое место строки (point forward ), и следовательно, указатель на нее из не листьевого уровня не надо изменять. С уважением, Алексей. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 10:19 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
При помощи DBCC IND, DBCC PAGE и советов Kalen Delaney (SQL server magazine online) проделал эксперимент. Код: plaintext 1. 2. 3. 4. 5. 6. 7.
2 страницы данных: 1:50 (содержит строки 1,2,3) 1:93 ( строки 4,5). Далее Код: plaintext
Результат. 3 страницы данных: 1:37 (содержит только строку 1), 1:50 (строки 2,0,3) и 1:93 (строки 4,5). Т.е. сервер добавил новую страницу и перенес данные снизу вверх. Страницы индекса не менялись (строк всего 6) Теперь ясность есть. Самые худшие опасения подтвердились. Ну и зачем нужен этот кластерный индекс, помогающий в очень редких (для работы моих юзеров) случаях? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 10:47 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
Самые худшие опасения подтвердились Интересно - а зачем делать кластерный индекс если известно что значения в этом поле не будут расти монотонно ? Вы еще по столбу timestamp сделайте кластерный индекс ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 10:50 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
А какой тогда кайф от кластерного индекса? Убрать один уровень страниц индекса? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 11:32 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
AloisПри помощи DBCC IND, DBCC PAGE и советов Kalen Delaney (SQL server magazine online) проделал эксперимент. Код: plaintext 1. 2. 3. 4. 5. 6. 7.
2 страницы данных: 1:50 (содержит строки 1,2,3) 1:93 ( строки 4,5). Далее Код: plaintext
Результат. 3 страницы данных: 1:37 (содержит только строку 1), 1:50 (строки 2,0,3) и 1:93 (строки 4,5). Т.е. сервер добавил новую страницу и перенес данные снизу вверх. Страницы индекса не менялись (строк всего 6) Теперь ясность есть. Самые худшие опасения подтвердились. Ну и зачем нужен этот кластерный индекс, помогающий в очень редких (для работы моих юзеров) случаях? Так где тут "худшие опасения". Естественно, будет перенос данных, но не более одной стрницы - 8 КБ для сервера это 0 по времени при ЛЮБОМ размере таблицы. Вы же опасались перестройки нелистьевого уровня индекса, а его и не произошло. С уважением, Алексей. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 11:40 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
Опасения, конечно, были не по этому примеру. Что будет, если в таблице с миллионом строк я проапдейчу кластерное поле половины строк? Думаю, что это не 0 по времени. А на сколько страниц данных приходится одна страница промежуточного уровня индекса при условии, что тип индексируемого поля INT (4 байта)? Думаю, что одна страница будет содержать ссылки на чуть меньше 2000 строк. На один миллион строк данных (в моем примере это больше 330 тыс страниц) - 501 страница индекса нижнего нелистьевого уровня и скорее всего одна страница верхнего плюс IAM. Итого - 503. Это гораздо меньше, чем 330 тысяч. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 11:56 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
Что будет, если в таблице с миллионом строк я проапдейчу кластерное поле половины строк? Думаю, что это не 0 по времени. Не 0. Только зачем так делать ? Если это разовая задача то надо сначала удалить кластерный индекс. Если постоянная то что-то не так в вашей консерватории. И плюс ко всему скзанному - у любого индекса существует fill factor. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 12:00 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
AloisОпасения, конечно, были не по этому примеру. Что будет, если в таблице с миллионом строк я проапдейчу кластерное поле половины строк? Думаю, что это не 0 по времени. А на сколько страниц данных приходится одна страница промежуточного уровня индекса при условии, что тип индексируемого поля INT (4 байта)? Думаю, что одна страница будет содержать ссылки на чуть меньше 2000 строк. На один миллион строк данных (в моем примере это больше 330 тыс страниц) - 501 страница индекса нижнего нелистьевого уровня и скорее всего одна страница верхнего плюс IAM. Итого - 503. Это гораздо меньше, чем 330 тысяч. Я для кластерного индекса выбираю, как правило, PK (Primary Key), тип данных Integer со свойством IDENTITY(1,1) и НИКОГДА не имею, описанную Вами ситуацию: PK никто и никогда не UPDATE-ит, а INDENTITY(1,1) гарантирует, что вставка будет только в конец. С уважением, Алексей. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 12:12 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
[quot GloryЕсли постоянная то что-то не так в вашей консерватории. [/quot] Согласен, пример надуман. АлексейЯ для кластерного индекса выбираю, как правило, PK (Primary Key), тип данных Integer со свойством IDENTITY(1,1) и НИКОГДА не имею, описанную Вами ситуацию: PK никто и никогда не UPDATE-ит, а INDENTITY(1,1) гарантирует, что вставка будет только в конец. У меня сделано абсолютно также. Хотя на большинстве таблиц логически РК можно задать и не на ИД. Вот почему я и пытаюсь открыть истину. Например, на одной из таблиц висят 6 некластерных индексов помимо кластерного. А вдруг, задай я кластер не на ИД, а на другом поле/наборе полей, и не нужны будут эти шесть индексов. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 12:22 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
Aleksey-Kдля кластерного индекса выбираю, как правило, PK (Primary Key), тип данных Integer со свойством IDENTITY(1,1)Загляните по ссылке , которую дал KRS544, есть подозрение, что Вам будет полезно ее просмотреть... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 13:43 |
|
Устройство кластерного индекса
|
|||
---|---|---|---|
#18+
ChA Aleksey-Kдля кластерного индекса выбираю, как правило, PK (Primary Key), тип данных Integer со свойством IDENTITY(1,1)Загляните по ссылке , которую дал KRS544, есть подозрение, что Вам будет полезно ее просмотреть... Спасибо прочитал, но не нашел там (если читать все обсуждение)противоречий с тем, что я сказал: (для кластерного индекса выбираю, КАК ПРАВИЛО, PK (Primary Key), тип данных Integer со свойством IDENTITY(1,1)). Нет правил без исключений.., но они (исключения) только подтверждают правила. С уважением, Алексей. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2005, 14:16 |
|
|
start [/forum/topic.php?fid=46&msg=33017696&tid=1684426]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
130ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 243ms |
0 / 0 |