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

Откуда: From Russia
Сообщений: 146
Допустим есть таблица с полем CustomerName. Сначала создаем по этому полю кластерный индекс, делаем поиск по этому полю. Затем удаляем кластерный индекс, создаем некластерный, снова делаем поиск.
Можно ли утверждать, что операция Index Seek по кластерному индексу будет проходить быстрее, чем по некластерному в силу того, что в случае с кластерным данные физически упорядочены на диске?
27 июл 12, 09:13    [12923105]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс быстрее некластерного?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Kudep,
Проверить лень?
+

create table #t ( id int primary key ) ;
with  L0
        as ( select 1 as c
             union all
             select 1
           ) ,
      L1
        as ( select 1 as c
             from   L0 as A
             cross join L0 as B
           ) ,
      L2
        as ( select 1 as c
             from   L1 as A
             cross join L1 as B
           ) ,
      L3
        as ( select 1 as c
             from   L2 as A
             cross join L2 as B
           ) ,
      L4
        as ( select 1 as c
             from   L3 as A
             cross join L3 as B
           ) ,
      L5
        as ( select 1 as c
             from   L4 as A
             cross join L4 as B
           ) ,
      Nums
        as ( select row_number() over ( order by ( select 0
                                                 ) ) as n
             from   L5
           )
  insert  into #t
          ( id
          )
          select top ( 1000000 )
                  n
          from    Nums
          order by n ;
          
create table #t1 ( id int ) ;
create index IX_1 on #t1(id);
with  L0
        as ( select 1 as c
             union all
             select 1
           ) ,
      L1
        as ( select 1 as c
             from   L0 as A
             cross join L0 as B
           ) ,
      L2
        as ( select 1 as c
             from   L1 as A
             cross join L1 as B
           ) ,
      L3
        as ( select 1 as c
             from   L2 as A
             cross join L2 as B
           ) ,
      L4
        as ( select 1 as c
             from   L3 as A
             cross join L3 as B
           ) ,
      L5
        as ( select 1 as c
             from   L4 as A
             cross join L4 as B
           ) ,
      Nums
        as ( select row_number() over ( order by ( select 0
                                                 ) ) as n
             from   L5
           )
  insert  into #t1
          ( id
          )
          select top ( 1000000 )
                  n
          from    Nums
          order by n ;          
          
          
          
set statistics io on;
set statistics time on;
declare @id int= 101 ;

select * from #t as t where id = @id
print '!!!!!!!!!!!!!!!!!!noclustered Index!!!!!!!!!!!!!!!!!!'
select * from #t1 as t where id = @id

27 июл 12, 09:22    [12923131]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс быстрее некластерного?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Они в любом случае упорядочены.
Другое дело если вы вытаскиваете колонки которых нет в индексе. Тогда появляется лишний оператор поиска в куче.
Тут даже тестить не надо.

Тема неоднократно подымалась.
27 июл 12, 15:08    [12925983]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс быстрее некластерного?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Kudep
Допустим есть таблица с полем CustomerName. Сначала создаем по этому полю кластерный индекс, делаем поиск по этому полю. Затем удаляем кластерный индекс, создаем некластерный, снова делаем поиск.
Можно ли утверждать, что операция Index Seek по кластерному индексу будет проходить быстрее, чем по некластерному в силу того, что в случае с кластерным данные физически упорядочены на диске?
Ничего физически на диске не упорядочено, в каком порядке приходили данные,в таком на диск и записались. А еще могли быть page splits или кто нить умный shrink выполнил. Короче, упорядоченность данных на диске это распространенное заблуждение.
27 июл 12, 20:37    [12927648]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс быстрее некластерного?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Mind,

-- Уменьшение размера таблицы, после изменения типа данных (менял туда-сюда smalldatetime и datetime у поля )
DBCC DBREINDEX('test01', 'PK_test01', 0) 


CLUSTERED INDEX
Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table.
Создает индекс, в котором логический порядок значений ключа определяет физический порядок соответствующих строк в таблице.

Ничего физически на диске не упорядочено(CLUSTERED INDEX), это как-то можно доказать?
27 июл 12, 21:00    [12927694]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс быстрее некластерного?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table.

эгммм. это всего лишь означает, что на листовом уровне кластерного индекса данные хранятся вместе с его ключами.
ключи кластерного индекса (логически упорядоченные) на листовом уровне индекса действительно физически связаны с соответствующими данными - они реально хранятся вместе (ну, не считая блобов, для простоты). в общем-то, и все.
27 июл 12, 21:21    [12927759]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс быстрее некластерного?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
trew
Mind,

-- Уменьшение размера таблицы, после изменения типа данных (менял туда-сюда smalldatetime и datetime у поля )
DBCC DBREINDEX('test01', 'PK_test01', 0) 


CLUSTERED INDEX
Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table.
Создает индекс, в котором логический порядок значений ключа определяет физический порядок соответствующих строк в таблице.

Ничего физически на диске не упорядочено(CLUSTERED INDEX), это как-то можно доказать?
"определяет физический порядок соответствующих строк в таблице" не эквивалентно "гарантирует физическую упорядоченность страниц на диске"
А доказать легко. Вставить данные в рандомный кластерный индекс и посмотреть как строки будут раскиданы по страницам данных. 
Это если не говорить о физической фрагментации файлов на диске, которую сервер 100% никак не может контролировать и гарантировать физическую упорядоченость чего бы то ни было.
27 июл 12, 23:43    [12928302]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить