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

Откуда:
Сообщений: 244
Добрый день.

Вопрос следующий:
Допустим есть таблица table1 с полями id, name1, name2.
поле id - кластерный индекс. По полю name1 не кластерный индекс, никакие столбцы не включены. То есть в индексе на поле name1, будет ссылка на кластерный индекс. В кластерном индексе будет ссылка на саму запись. Тут все понятно, как по name1 сервер достанет name2.

Другая ситуация мне непоянтна:
Та же таблица, тот же индекс по name1. Куда ссылается значение индекса. То есть как сервер будет выполнять такой запрос
select name2 from table1 where name1 = '123'. Какая может быть логика ИСПОЛЬЗОВАНИЯ индекса?
8 ноя 13, 11:04    [15095848]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Та же таблица, тот же индекс по name1. Куда ссылается значение индекса.

BOL - Nonclustered Index Structures
If the table is a heap, which means it does not have a clustered index, the row locator is a pointer to the row. The pointer is built from the file identifier (ID), page number, and number of the row on the page. The whole pointer is known as a Row ID (RID).
8 ноя 13, 11:06    [15095870]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
Гость333
Member

Откуда:
Сообщений: 3683
super-code,

Значение индекса ссылается на row identifier, он же RID.
RID — это указатель на место в БД, состоит из номера файла, номера страницы, номера слота в странице.
Если вы посмотрите план выполнения вашего запроса, то увидите там операции Nonclustered Index Seek + RID Lookup.
8 ноя 13, 11:09    [15095893]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory, спасибо.
То есть, если я планирую, поиск, только по не кластерному индексу, как в показанном мной случае, то лучше не создавать кластерный индекс. Тогда сервер пропустит операцию "ссылка от не кластерного индекс на кластерный", а выполнит, только операции: "поиск в не кластерном", "переход к записи по ссылки из не кластерного индекса", верно?
8 ноя 13, 11:11    [15095911]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
https://www.sql.ru/forum/actualpost.aspx
8 ноя 13, 11:13    [15095921]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
super-code
Member

Откуда:
Сообщений: 244
Вообщем всем спасибо, ясно. А зачем тогда, если есть кластерный индекс, то ссылка создается на него, а не по RID ?
Можно было бы во многих запросах пропускать одну операцию "ссылка от не кластерного индекса к кластерному" ? Может RID занимает больше памяти, чем ссылка на позицию кластерного индекса?
8 ноя 13, 11:13    [15095927]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
То есть, если я планирую, поиск, только по не кластерному индексу, как в показанном мной случае, то лучше не создавать кластерный индекс. Тогда сервер пропустит операцию "ссылка от не кластерного индекс на кластерный", а выполнит, только операции: "поиск в не кластерном", "переход к записи по ссылки из не кластерного индекса", верно?

А есть разница в между "переход на сслыку кластерного индекса" и "переход на ссылку Row ID " ?
8 ноя 13, 11:14    [15095929]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
сорри
https://www.sql.ru/articles/mssql/03013101indexes.shtml#
8 ноя 13, 11:14    [15095940]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Вообщем всем спасибо, ясно. А зачем тогда, если есть кластерный индекс, то ссылка создается на него, а не по RID ?

Потому что кластерный индекс и так содержит RID
8 ноя 13, 11:15    [15095941]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory,

Возможно, я ошибаюсь, но представляю себе так. Структура таблицы описана в первом посте.
Есть два случая индекса, тоже описаны в первом посте.

Случай А) (Есть кластерный и не кластерный)
есть запрос: select name2 from table1 where name1 = '123'

Логика:
1. Сервер ищет в некластерном индексе name1 нужные значения.
2. По ссылкам переходит в ячейку памяти кластерного индекса.
3. В кластерном индексе у нас есть RID, по нему переходит к записи
4. Читает нужные значения

Случай Б) (Есть не кластерный и все)
есть запрос: select name2 from table1 where name1 = '123'

Логика:
1. Сервер ищет в некластерном индексе name1 нужные значения.
2. Переходит по RID (хранится в некластерном индексе)
3. Читает нужные значения


То есть логика без кластерного индекса получается быстрее. Вопрос - зачем, если есть кластерный индекс, то создается ссылка на него, а не на RID (ведь получается больше на одну операцию) ?
8 ноя 13, 11:18    [15095965]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
1. Сервер ищет в некластерном индексе name1 нужные значения.
2. По ссылкам переходит в ячейку памяти кластерного индекса.
3. В кластерном индексе у нас есть RID, по нему переходит к записи
4. Читает нужные значения

п.3 нет. Потому что ссылка на кластерный ключ уже есть переход на запись
Просто переход на кластерный индекс может быть быстрее, чем переход на RID
8 ноя 13, 11:21    [15095981]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory, ок, спасибо. Не очень правильно понимал структуру хранения кластерного индекса. Почитал msdn, стала понятнее.
8 ноя 13, 11:33    [15096069]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
super-code
А зачем тогда, если есть кластерный индекс, то ссылка создается на него, а не по RID ?
Можно было бы во многих запросах пропускать одну операцию "ссылка от не кластерного индекса к кластерному" ?


Это очень сложный вопрос, по-простому -- чтобы меньше UPDATE-ить индексы. Если индекс содержить физический RID, и положение строки меняется -- надо менять все индексные записи. Если индекс содержить значение кластерного индекса, то UPDATE-ить индексные записи нужно только при изменении значений полей кластерного индекса, а т.к. это обычно PK, то это почти никогда не происходит.

super-code

Может RID занимает больше памяти, чем ссылка на позицию кластерного индекса?


RID занимает фиксированное число байт, что-то типа длины long или двух длин long.
А значение кластерного индекса занимает сколько угодно, в зависимотси от того, каким ты его создал.
Если оно длинное, то его значения включаются во все индексные записи и от этого они распухают,
их меньше влезает на страницу, и больше надо читать страниц на одно и то же кол-во индексных записей.
Производительность ухудшается. Соотв. -- надо делать кластерный индекс как можно меньшего размера.
В MSSQL обычно это -- PK на identity целого типа.
8 ноя 13, 14:44    [15097830]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
super-code
Member

Откуда:
Сообщений: 244
MasterZiv, отлично написал. Благодарю!
8 ноя 13, 15:04    [15097997]     Ответить | Цитировать Сообщить модератору
 Re: Куда ссылкается не кластерный индекс, если отсутствует кластерный  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Glory
super-code
1. Сервер ищет в некластерном индексе name1 нужные значения.
2. По ссылкам переходит в ячейку памяти кластерного индекса.
3. В кластерном индексе у нас есть RID, по нему переходит к записи
4. Читает нужные значения

п.3 нет. Потому что ссылка на кластерный ключ уже есть переход на запись
Просто переход на кластерный индекс может быть быстрее, чем переход на RID
Не совсем так. Ссылка на кластерный ключ это всего лишь значения кластерного ключа. Потом нужно сделать Seek в дереве кластерного индекса начиная с корня, а это еще 3-4 перехода в зависимости от размера самого дерева. Но с практической точки зрения, разницы в производительности почти нет.

Да и в кластерном индексе нет никакого RID, потому что кластерный индекс это и есть данные, зачем там еще ссылка.
8 ноя 13, 22:20    [15100342]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить