powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Устройство кластерного индекса
25 сообщений из 49, страница 1 из 2
Устройство кластерного индекса
    #33015988
Alois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
До сих пор не могу поверить, что кластерный индекс, определенный для ОДНОГО из столбцов таблицы, хранит внутри себя данные других столбцов любых типов. Может кто-нибудь кинет в меня ссылкой на нормальную статью (желательно на русском), где четко объяснено: что именно хранится в кластерном индексе и как устроено его дерево?
Заранее благодарю.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33015999
Фотография tpg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33016029
Smirnov Anton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AloisДо сих пор не могу поверить, что кластерный индекс, определенный для ОДНОГО из столбцов таблицы, хранит внутри себя данные других столбцов любых типов. Может кто-нибудь кинет в меня ссылкой на нормальную статью (желательно на русском), где четко объяснено: что именно хранится в кластерном индексе и как устроено его дерево?
Заранее благодарю.
на самом деле он ничего не хранит в смысле дублирования
просто корневые страницы этого кластерного индекса и есть сама таблица
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33016057
Alois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 tpg
Спасибо. Навскидку: дельная статья с множеством деталей, не встречавшихся мне в других местах. Буду изучать.

ОЧЕНЬ редко удавалось использовать кластерный индекс для несправочных таблиц, чтобы повысить общее быстродействие. Всегда найдутся запросы, которым этот индекс мешает.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33016301
Alois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прочитал статью. Вопросы остались.

Например, есть таблица
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE [dbo].[TBL] (
	[ID] [int] NOT NULL ,
	[Name] [char] ( 7000 ) COLLATE Cyrillic_General_CI_AS NOT NULL 

CREATE UNIQUE CLUSTERED
  INDEX [PK_TBL] ON [dbo].[TBL] ([ID])
WITH
    DROP_EXISTING

insert TBL values ( 1 ,'aaa')
insert TBL values ( 3 ,'ccc')
-- !!!
insert TBL values ( 2 ,'bbb')

В таблице есть поле типа char(7000). Сервер в случае последнего INSERTa будет страницы сплиттить? Как я понял, данные всех полей находятся рядом на страницах. Иначе никакой разницы между кластерным и некластерным индексом нет. Оба типа на своих страницах содержат закладки на страницы с данными.
Если не трудно, поясните, плиз.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33016708
Alois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может уважаемый Glory подскажет?
Вопрос для меня очень важный для понимания устрйства хранилища данных. Даже в указанной tpg статье на картике показано расположение данных только индексированных полей. Где располагаются остальные? Как привязаны к индексу?
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33016736
Smirnov Anton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотите посмотреть что будет - DBCC PAGE вам в руки
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33016752
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже в указанной tpg статье на картике показано расположение данных только индексированных полей. Где располагаются остальные? Как привязаны к индексу?
Слева/справа на картинке надписано что есть что - INDEX/DATA
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33016898
Alois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Glory. Давайте конкретнее. Из рис.3 я не вижу, где расположены значения полей, например, ContactTitle или Phone или Fax? Зато рисунок 2 для некластерного индекса всё прекрасно объясняет.

2 Anton. Видать, придется самому копать.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017002
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alois2 Glory. Давайте конкретнее. Из рис.3 я не вижу, где расположены значения полей, например, ContactTitle или Phone или Fax?

На рис.3 у нижнего ряда кубиков слева написано DATA что означает что это страницы данных
У верхнего ряда кубиков справа написано INDEX что означает что это страницы индекса.

AloisЗато рисунок 2 для некластерного индекса всё прекрасно объясняет.

Для некластерного индекса нужно смотреть рисунки 5 и 6
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017176
KRS544
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017467
Alois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 KRS544. Я натыкался на эту страницу, но так и несмог ее прочитать. Перебрал все настроенные у меня кодировки, но увы.

2 Glory
авторНа рис.3 у нижнего ряда кубиков слева написано DATA что означает что это страницы данных
У верхнего ряда кубиков справа написано INDEX что означает что это страницы индекса.
Даже обидно выслушивать такие комментарии. Это было понятно с самого начала. Вопрос не в этом.
А вот в чем. Страницы с данными я вляются листьями кластерного индекса. Но они упорядочены по индексируемому полю. В примере из моего поста 1469029 строка занимает 7008 байтов. Допустим строковое поле занимает 1000 байтов. тогда на странице данных влезет 7 строк.
Вопрос: при вставке (в примере это последний ИНСЕРТ) строки серверу придется создавать новую страницу и ФИЗИЧЕСКИ перемещать строку с ID=3 на другую страницу. После чего на страницах промежуточного уровня заново сортировать данные, возможно опять с разбивкой страниц. Верно?
Это же до фига работы.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017501
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже обидно выслушивать такие комментарии. Это было понятно с самого начала.
Ну извините. Значит я не так понял ваш вопрос

Вопрос: при вставке (в примере это последний ИНСЕРТ) строки серверу придется создавать новую страницу и ФИЗИЧЕСКИ перемещать строку с ID=3 на другую страницу. После чего на страницах промежуточного уровня заново сортировать данные, возможно опять с разбивкой страниц. Верно?
Если на индексной странице нет места то да, придется. Только расщепление пойдет сверху вниз а не снизу вверх.

Но наличие места на индексной странице регулируется fill factor индекса.
И даже при fill factor 100% при создании индекса на индексной странице всегда резервируется одно свободное место.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017504
saint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас и так каждая строка на отдельной странице хранится. При вставке новой строки будет создана новая страница, добавлены в нее данные, а уровнем выше будет добавлена всего одна запись, указывающая на эту страницу
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017506
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alois2 KRS544. Я натыкался на эту страницу, но так и несмог ее прочитать. Перебрал все настроенные у меня кодировки, но увы.

2 Glory
авторНа рис.3 у нижнего ряда кубиков слева написано DATA что означает что это страницы данных
У верхнего ряда кубиков справа написано INDEX что означает что это страницы индекса.
Даже обидно выслушивать такие комментарии. Это было понятно с самого начала. Вопрос не в этом.
А вот в чем. Страницы с данными я вляются листьями кластерного индекса. Но они упорядочены по индексируемому полю. В примере из моего поста 1469029 строка занимает 7008 байтов. Допустим строковое поле занимает 1000 байтов. тогда на странице данных влезет 7 строк.
Вопрос: при вставке (в примере это последний ИНСЕРТ) строки серверу придется создавать новую страницу и ФИЗИЧЕСКИ перемещать строку с ID=3 на другую страницу. После чего на страницах промежуточного уровня заново сортировать данные, возможно опять с разбивкой страниц. Верно?
Это же до фига работы.
Нет не верно.. Сервер помещает в этом случае в страницы данных ссылку на новое место строки (point forward ), и следовательно, указатель на нее из не листьевого уровня не надо изменять.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017555
Alois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При помощи DBCC IND, DBCC PAGE и советов Kalen Delaney (SQL server magazine online) проделал эксперимент.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE TBL (ID char( 10 ) not null, INFO char( 2100 ) not null)
CREATE UNIQUE CLUSTERED INDEX IDX on TBL (ID)
insert TBL values ('a1a1a1a1', REPLICATE('1', 2000 )) -- строка 1
insert TBL values ('b2b2b2b2', REPLICATE('2', 2000 )) -- строка 2
insert TBL values ('c3c3c3c3', REPLICATE('3', 2000 )) -- строка 3
insert TBL values ('d4d4d4d4', REPLICATE('4', 2000 )) -- строка 4
insert TBL values ('e5e5e5e5', REPLICATE('5', 2000 )) -- строка 5
Результат.
2 страницы данных: 1:50 (содержит строки 1,2,3) 1:93 ( строки 4,5).

Далее
Код: plaintext
insert TBL values ('b0b0b0b0', REPLICATE('0', 2000 )) -- строка  0 
Т.е. вставляем между 1-ой и 2-ой строками.
Результат.
3 страницы данных: 1:37 (содержит только строку 1), 1:50 (строки 2,0,3) и 1:93 (строки 4,5).
Т.е. сервер добавил новую страницу и перенес данные снизу вверх. Страницы индекса не менялись (строк всего 6)

Теперь ясность есть. Самые худшие опасения подтвердились. Ну и зачем нужен этот кластерный индекс, помогающий в очень редких (для работы моих юзеров) случаях?
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017564
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самые худшие опасения подтвердились
Интересно - а зачем делать кластерный индекс если известно что значения в этом поле не будут расти монотонно ? Вы еще по столбу timestamp сделайте кластерный индекс
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017672
Alois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А какой тогда кайф от кластерного индекса? Убрать один уровень страниц индекса?
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017696
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AloisПри помощи DBCC IND, DBCC PAGE и советов Kalen Delaney (SQL server magazine online) проделал эксперимент.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE TBL (ID char( 10 ) not null, INFO char( 2100 ) not null)
CREATE UNIQUE CLUSTERED INDEX IDX on TBL (ID)
insert TBL values ('a1a1a1a1', REPLICATE('1', 2000 )) -- строка 1
insert TBL values ('b2b2b2b2', REPLICATE('2', 2000 )) -- строка 2
insert TBL values ('c3c3c3c3', REPLICATE('3', 2000 )) -- строка 3
insert TBL values ('d4d4d4d4', REPLICATE('4', 2000 )) -- строка 4
insert TBL values ('e5e5e5e5', REPLICATE('5', 2000 )) -- строка 5
Результат.
2 страницы данных: 1:50 (содержит строки 1,2,3) 1:93 ( строки 4,5).

Далее
Код: plaintext
insert TBL values ('b0b0b0b0', REPLICATE('0', 2000 )) -- строка  0 
Т.е. вставляем между 1-ой и 2-ой строками.
Результат.
3 страницы данных: 1:37 (содержит только строку 1), 1:50 (строки 2,0,3) и 1:93 (строки 4,5).
Т.е. сервер добавил новую страницу и перенес данные снизу вверх. Страницы индекса не менялись (строк всего 6)

Теперь ясность есть. Самые худшие опасения подтвердились. Ну и зачем нужен этот кластерный индекс, помогающий в очень редких (для работы моих юзеров) случаях?

Так где тут "худшие опасения". Естественно, будет перенос данных, но не более одной стрницы - 8 КБ для сервера это 0 по времени при ЛЮБОМ размере таблицы. Вы же опасались перестройки нелистьевого уровня индекса, а его и не произошло.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017731
Alois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опасения, конечно, были не по этому примеру. Что будет, если в таблице с миллионом строк я проапдейчу кластерное поле половины строк? Думаю, что это не 0 по времени.
А на сколько страниц данных приходится одна страница промежуточного уровня индекса при условии, что тип индексируемого поля INT (4 байта)? Думаю, что одна страница будет содержать ссылки на чуть меньше 2000 строк. На один миллион строк данных (в моем примере это больше 330 тыс страниц) - 501 страница индекса нижнего нелистьевого уровня и скорее всего одна страница верхнего плюс IAM. Итого - 503. Это гораздо меньше, чем 330 тысяч.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017746
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что будет, если в таблице с миллионом строк я проапдейчу кластерное поле половины строк? Думаю, что это не 0 по времени.
Не 0. Только зачем так делать ?
Если это разовая задача то надо сначала удалить кластерный индекс.
Если постоянная то что-то не так в вашей консерватории.

И плюс ко всему скзанному - у любого индекса существует fill factor.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017793
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AloisОпасения, конечно, были не по этому примеру. Что будет, если в таблице с миллионом строк я проапдейчу кластерное поле половины строк? Думаю, что это не 0 по времени.
А на сколько страниц данных приходится одна страница промежуточного уровня индекса при условии, что тип индексируемого поля INT (4 байта)? Думаю, что одна страница будет содержать ссылки на чуть меньше 2000 строк. На один миллион строк данных (в моем примере это больше 330 тыс страниц) - 501 страница индекса нижнего нелистьевого уровня и скорее всего одна страница верхнего плюс IAM. Итого - 503. Это гораздо меньше, чем 330 тысяч.

Я для кластерного индекса выбираю, как правило, PK (Primary Key), тип данных Integer со свойством IDENTITY(1,1) и НИКОГДА не имею, описанную Вами ситуацию: PK никто и никогда не UPDATE-ит, а INDENTITY(1,1) гарантирует, что вставка будет только в конец.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33017827
Alois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot GloryЕсли постоянная то что-то не так в вашей консерватории.
[/quot]
Согласен, пример надуман.
АлексейЯ для кластерного индекса выбираю, как правило, PK (Primary Key), тип данных Integer со свойством IDENTITY(1,1) и НИКОГДА не имею, описанную Вами ситуацию: PK никто и никогда не UPDATE-ит, а INDENTITY(1,1) гарантирует, что вставка будет только в конец.
У меня сделано абсолютно также. Хотя на большинстве таблиц логически РК можно задать и не на ИД. Вот почему я и пытаюсь открыть истину. Например, на одной из таблиц висят 6 некластерных индексов помимо кластерного. А вдруг, задай я кластер не на ИД, а на другом поле/наборе полей, и не нужны будут эти шесть индексов.
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33018120
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-Kдля кластерного индекса выбираю, как правило, PK (Primary Key), тип данных Integer со свойством IDENTITY(1,1)Загляните по ссылке , которую дал KRS544, есть подозрение, что Вам будет полезно ее просмотреть...
...
Рейтинг: 0 / 0
Устройство кластерного индекса
    #33018222
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA Aleksey-Kдля кластерного индекса выбираю, как правило, PK (Primary Key), тип данных Integer со свойством IDENTITY(1,1)Загляните по ссылке , которую дал KRS544, есть подозрение, что Вам будет полезно ее просмотреть...

Спасибо прочитал, но не нашел там (если читать все обсуждение)противоречий с тем, что я сказал: (для кластерного индекса выбираю, КАК ПРАВИЛО, PK (Primary Key), тип данных Integer со свойством IDENTITY(1,1)). Нет правил без исключений.., но они (исключения) только подтверждают правила.
С уважением, Алексей.
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Устройство кластерного индекса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]