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

Откуда: From Russia
Сообщений: 146
Допустим, есть таблица, упорядоченная в виде кластерного индекса по полю ClientID.
Кроме того построен некластерный индекс по полям FirstName, Status, ClientID.
Есть запрос:
select FirstName, Status, ClientID from Clients where ...

Можно ли с уверенностью сказать, что поле ClientID можно удалить из некластерного индекса, и ничего не изменится?
Т.е. ClientID и так по умолчанию будет в каждой записи некластерного индекса, так как эти ключи хранятся в нем на уровне листьев.
14 авг 12, 15:38    [13009883]     Ответить | Цитировать Сообщить модератору
 Re: Наличие кластерного ключа в некластерном индексе имеет ли смысл?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Поле(я) кластерного индекса будут содержаться всегда на листовом уровне некластерного индекса, а если некластерный индекс НЕУНИКАЛЬНЫЙ, то и на промежуточном (нелистовом) уровне индекс будет содержать поля кластерного индекса
14 авг 12, 15:44    [13009928]     Ответить | Цитировать Сообщить модератору
 Re: Наличие кластерного ключа в некластерном индексе имеет ли смысл?  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
Knyazev Alexey
Поле(я) кластерного индекса будут содержаться всегда на листовом уровне некластерного индекса, а если некластерный индекс НЕУНИКАЛЬНЫЙ, то и на промежуточном (нелистовом) уровне индекс будет содержать поля кластерного индекса

ясно, а почему "если некластерный индекс НЕУНИКАЛЬНЫЙ, то и на промежуточном (нелистовом) уровне индекс будет содержать поля кластерного индекса"? Может есть ссылка под рукой, где почитать?
14 авг 12, 16:18    [13010232]     Ответить | Цитировать Сообщить модератору
 Re: Наличие кластерного ключа в некластерном индексе имеет ли смысл?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Kudep
Knyazev Alexey
Поле(я) кластерного индекса будут содержаться всегда на листовом уровне некластерного индекса, а если некластерный индекс НЕУНИКАЛЬНЫЙ, то и на промежуточном (нелистовом) уровне индекс будет содержать поля кластерного индекса

ясно, а почему "если некластерный индекс НЕУНИКАЛЬНЫЙ, то и на промежуточном (нелистовом) уровне индекс будет содержать поля кластерного индекса"? Может есть ссылка под рукой, где почитать?


если индекс не уникальный, то уникальность "добивается" за счёт включения кластерного индекса (т.к. он всегда уникальный, даже если вы его таким не делали)
14 авг 12, 16:20    [13010243]     Ответить | Цитировать Сообщить модератору
 Re: Наличие кластерного ключа в некластерном индексе имеет ли смысл?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Kudep,

Не очень известный факт о кластерном индексе
14 авг 12, 16:21    [13010249]     Ответить | Цитировать Сообщить модератору
 Re: Наличие кластерного ключа в некластерном индексе имеет ли смысл?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
if object_id ( 'dbo.tbl_20120814_01', 'U' ) is not null
drop table dbo.tbl_20120814_01;
go 
create table dbo.tbl_20120814_01 ( id int identity constraint pk_tbl_20120814_01 primary key clustered, a int, b int );
go

if object_id ( 'dbo.tbl_20120814_02', 'U' ) is not null
drop table dbo.tbl_20120814_02;
go 
create table dbo.tbl_20120814_02 ( id int identity constraint pk_tbl_20120814_02 primary key clustered, a int, b int );
go


with cte
as
(
select * from ( values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9) ) t(i)
)
insert into dbo.tbl_20120814_01 ( a, b )
output inserted.a, inserted.b into dbo.tbl_20120814_02 ( a, b )
select t1.i * 100 + t2.i * 10 + t3.i
     , t1.i * 100 + t2.i * 10 + t3.i
  from cte t1, cte t2, cte t3;
go

--Не уникальный индекс на таблице dbo.tbl_20120814_01
create index ix_ab on dbo.tbl_20120814_01 ( a, b );
--Уникальный индекс на таблице dbo.tbl_20120814_02
create unique index ix_ab on dbo.tbl_20120814_02 ( a, b );
go


select db_id() as db_id
     , left( object_name( object_id ), 20 ) as tbl_name
     , left( name, 20 ) as ind_name
     , index_id 
  from sys.indexes
  where object_id in ( object_id ( 'dbo.tbl_20120814_01', 'U' )
                     , object_id ( 'dbo.tbl_20120814_02', 'U' ) 
                     );
/*
db_id  tbl_name             ind_name             index_id
------ -------------------- -------------------- -----------
6      tbl_20120814_01      pk_tbl_20120814_01   1
6      tbl_20120814_01      ix_ab                2
6      tbl_20120814_02      pk_tbl_20120814_02   1
6      tbl_20120814_02      ix_ab                2
*/


--Таблица без уникального некластерного индекса dbo.tbl_20120814_01----------------------------------------------------
dbcc ind ( 6, 'dbo.tbl_20120814_01', 2 );
go
--Таблица с уникальным некластерным индексом dbo.tbl_20120814_02----------------------------------------------------
dbcc ind ( 6, 'dbo.tbl_20120814_02', 2 );
go

dbcc traceon ( 3604 );

--Не листовая страница таблицы dbo.tbl_20120814_01
dbcc page ( 6, 1, 172, 3 );
/*
FileId PageId      Row    Level  ChildFileId ChildPageId a (key)     b (key)     id (key)    KeyHashValue     Row Size
------ ----------- ------ ------ ----------- ----------- ----------- ----------- ----------- ---------------- --------
1      172         0      1      1           168         NULL        NULL        NULL        NULL             22
1      172         1      1      1           171         449         449         945         NULL             22
1      172         2      1      1           174         898         898         890         NULL             22
*/
--Не листовая страница таблицы dbo.tbl_20120814_02
dbcc page ( 6, 1, 179, 3 );
/*
FileId PageId      Row    Level  ChildFileId ChildPageId a (key)     b (key)     KeyHashValue     Row Size
------ ----------- ------ ------ ----------- ----------- ----------- ----------- ---------------- --------
1      179         0      1      1           175         NULL        NULL        NULL             18
1      179         1      1      1           178         449         449         NULL             18
1      179         2      1      1           180         898         898         NULL             18
*/

--**************************************

--Листовая страница таблицы dbo.tbl_20120814_01
dbcc page ( 6, 1, 168, 3 );
/*
FileId PageId      Row    Level  a (key)     b (key)     id (key)    KeyHashValue     Row Size
------ ----------- ------ ------ ----------- ----------- ----------- ---------------- --------
1      168         0      0      0           0           1           (f9119e4526ca)   16
1      168         1      0      1           1           101         (de828ed6a60d)   16
1      168         2      0      2           2           201         (5dd62d55cdec)   16
...
*/
--Листовая страница таблицы dbo.tbl_20120814_02
dbcc page ( 6, 1, 175, 3 );
/*
FileId PageId      Row    Level  a (key)     b (key)     id          KeyHashValue     Row Size
------ ----------- ------ ------ ----------- ----------- ----------- ---------------- --------
1      175         0      0      0           0           1           (42416d56cea6)   16
1      175         1      0      1           1           101         (e2338e2f4a9f)   16
1      175         2      0      2           2           201         (e94538932c7c)   16
...
*/
14 авг 12, 16:26    [13010288]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить