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

ОЧЕНЬ редко удавалось использовать кластерный индекс для несправочных таблиц, чтобы повысить общее быстродействие. Всегда найдутся запросы, которым этот индекс мешает.
...
Рейтинг: 0 / 0
14.04.2005, 15:44
    #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
14.04.2005, 17:20
    #33016708
Alois
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Устройство кластерного индекса
Может уважаемый Glory подскажет?
Вопрос для меня очень важный для понимания устрйства хранилища данных. Даже в указанной tpg статье на картике показано расположение данных только индексированных полей. Где располагаются остальные? Как привязаны к индексу?
...
Рейтинг: 0 / 0
14.04.2005, 17:29
    #33016736
Smirnov Anton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Устройство кластерного индекса
хотите посмотреть что будет - DBCC PAGE вам в руки
...
Рейтинг: 0 / 0
14.04.2005, 17:35
    #33016752
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Устройство кластерного индекса
Даже в указанной tpg статье на картике показано расположение данных только индексированных полей. Где располагаются остальные? Как привязаны к индексу?
Слева/справа на картинке надписано что есть что - INDEX/DATA
...
Рейтинг: 0 / 0
14.04.2005, 18:38
    #33016898
Alois
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Устройство кластерного индекса
2 Glory. Давайте конкретнее. Из рис.3 я не вижу, где расположены значения полей, например, ContactTitle или Phone или Fax? Зато рисунок 2 для некластерного индекса всё прекрасно объясняет.

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

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

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

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

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

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

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

2 Glory
авторНа рис.3 у нижнего ряда кубиков слева написано DATA что означает что это страницы данных
У верхнего ряда кубиков справа написано INDEX что означает что это страницы индекса.
Даже обидно выслушивать такие комментарии. Это было понятно с самого начала. Вопрос не в этом.
А вот в чем. Страницы с данными я вляются листьями кластерного индекса. Но они упорядочены по индексируемому полю. В примере из моего поста 1469029 строка занимает 7008 байтов. Допустим строковое поле занимает 1000 байтов. тогда на странице данных влезет 7 строк.
Вопрос: при вставке (в примере это последний ИНСЕРТ) строки серверу придется создавать новую страницу и ФИЗИЧЕСКИ перемещать строку с ID=3 на другую страницу. После чего на страницах промежуточного уровня заново сортировать данные, возможно опять с разбивкой страниц. Верно?
Это же до фига работы.
Нет не верно.. Сервер помещает в этом случае в страницы данных ссылку на новое место строки (point forward ), и следовательно, указатель на нее из не листьевого уровня не надо изменять.
С уважением, Алексей.
...
Рейтинг: 0 / 0
15.04.2005, 10:47
    #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
15.04.2005, 10:50
    #33017564
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Устройство кластерного индекса
Самые худшие опасения подтвердились
Интересно - а зачем делать кластерный индекс если известно что значения в этом поле не будут расти монотонно ? Вы еще по столбу timestamp сделайте кластерный индекс
...
Рейтинг: 0 / 0
15.04.2005, 11:32
    #33017672
Alois
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Устройство кластерного индекса
А какой тогда кайф от кластерного индекса? Убрать один уровень страниц индекса?
...
Рейтинг: 0 / 0
15.04.2005, 11:40
    #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
15.04.2005, 11:56
    #33017731
Alois
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Устройство кластерного индекса
Опасения, конечно, были не по этому примеру. Что будет, если в таблице с миллионом строк я проапдейчу кластерное поле половины строк? Думаю, что это не 0 по времени.
А на сколько страниц данных приходится одна страница промежуточного уровня индекса при условии, что тип индексируемого поля INT (4 байта)? Думаю, что одна страница будет содержать ссылки на чуть меньше 2000 строк. На один миллион строк данных (в моем примере это больше 330 тыс страниц) - 501 страница индекса нижнего нелистьевого уровня и скорее всего одна страница верхнего плюс IAM. Итого - 503. Это гораздо меньше, чем 330 тысяч.
...
Рейтинг: 0 / 0
15.04.2005, 12:00
    #33017746
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Устройство кластерного индекса
Что будет, если в таблице с миллионом строк я проапдейчу кластерное поле половины строк? Думаю, что это не 0 по времени.
Не 0. Только зачем так делать ?
Если это разовая задача то надо сначала удалить кластерный индекс.
Если постоянная то что-то не так в вашей консерватории.

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

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


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