Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Число просмотров в statistic io  [new]
Yayaadmin
Guest
Читаю https://msdn.microsoft.com/ru-ru/library/ms184361.aspx, все в принципе понятно, кроме числа просмотров, ясно, что если 0 то SQL нашел уникальную строку и вернул, а вот если 1, индекс не уникален и ему необходимо проверить есть ли еще значения которые нам нужны. Вопрос, как SQL server это проверяет, по идее это доп. операция сканирования, но на скорость выполнения это не влиет (взял столбец, значения уникальные, индекс нет, выполнил запрос where = value, число лог. чтений 3, число просмотров 1, сделал индекс уникальным, число лог. чтений 3, просмотров 0, скорость выполнения не изменилась).
7 окт 16, 07:59    [19753408]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
Владислав Колосов
Member

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

смотрите на план запроса, будет понятно, откуда появляются просмотры.
7 окт 16, 10:20    [19753939]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
o-o
Guest
Владислав Колосов
Yayaadmin,
смотрите на план запроса, будет понятно, откуда появляются просмотры.

что это в плане поменяется,
если я вместо уникального по неуникальному индексу буду искать?
---
вообще ТС спрашивал, как будет поиск по неуникальному индексу происходить.
так вот ровно так, как и по уникальному.
потому что на низком уровне ключ индекса всегда уникален, иначе это не ключ.
ну т.е. к ключу индекса (того, который мы объявили в CREATE INDEX)
добавляется uniquifier, таким образом получаем реальный ключ,
который присутствует на всех уровнях индекса
7 окт 16, 10:56    [19754110]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Yayaadmin,

> Вопрос, как SQL server это проверяет, по идее это доп. операция сканирования, но на скорость выполнения это не влиет

да, так и будет. поиск, а потом сканирование от найденного значения. если фактически значения уникальны, то оно сразу же и закончится - лишних страниц читать, скорее всего, необходимости не будет (может понадобиться одно лишнее чтение, если найденная запись находится в самом конце страницы).
7 окт 16, 11:03    [19754160]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
Yayaadmin
Guest
Владислав Колосов
Yayaadmin,

смотрите на план запроса, будет понятно, откуда появляются просмотры.


А вот непонятно.
Смотрю, index seek и select, все. Если индекс уникален то идет просто кол-во лог чтений (3, у индекса 3 уровня), если нет, то кол-во лог чтений + число просмотров 1, планы ничем не отличаются. Вот я и спрашиваю как SQL делает этот просмотр и почему нет никакой разницы в скорости. Как без доп расходов он так быстро определил что больше таких строк нет?
7 окт 16, 11:04    [19754162]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
Yayaadmin
Guest
daw
Yayaadmin,

> Вопрос, как SQL server это проверяет, по идее это доп. операция сканирования, но на скорость выполнения это не влиет

да, так и будет. поиск, а потом сканирование от найденного значения. если фактически значения уникальны, то оно сразу же и закончится - лишних страниц читать, скорее всего, необходимости не будет (может понадобиться одно лишнее чтение, если найденная запись находится в самом конце страницы).


Ясно, спасибо. Т.е. расходы все ровно есть, просто они настолько незначительны что никак не влияют на скорость.
7 окт 16, 11:07    [19754180]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
Yayaadmin
Guest
daw
Yayaadmin,

> Вопрос, как SQL server это проверяет, по идее это доп. операция сканирования, но на скорость выполнения это не влиет

(может понадобиться одно лишнее чтение, если найденная запись находится в самом конце страницы).


А здесь можно подробнее, зачем сервер выполнит еще чтение, если он уже прочитал страницу и должен был за раз все вытащить?
7 окт 16, 11:10    [19754194]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
o-o
Guest
Yayaadmin
daw
Yayaadmin,

> Вопрос, как SQL server это проверяет, по идее это доп. операция сканирования, но на скорость выполнения это не влиет

(может понадобиться одно лишнее чтение, если найденная запись находится в самом конце страницы).


А здесь можно подробнее, зачем сервер выполнит еще чтение, если он уже прочитал страницу и должен был за раз все вытащить?

если у вас туча повторяющихся значений
и они не влазят на одну страницу индекса,
то прочтет еще столько страниц, сколько занято под эти значения,
не только одну
7 окт 16, 11:19    [19754236]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Yayaadmin,

> А здесь можно подробнее, зачем сервер выполнит еще чтение, если он уже прочитал страницу и должен был за раз все вытащить?

если найденная запись в самом конце страницы, а индекс не объявлен уникальным, ему придется прочитать следующую страницу, чтобы проверить, что там нет еще одного такого же (как найденное) значения. в случае с уникальным индексом этого делать нет необходимости.
create table #t (c varchar(900));
go
create index t_i1 on #t(c);
go
create unique index t_i2 on #t(c);
go
insert into #t (c) values 
  (replicate('a', 900))
  , (replicate('b', 900))
  , (replicate('c', 900))
  , (replicate('d', 900))
  , (replicate('e', 900))
  , (replicate('f', 900))
  , (replicate('g', 900))
  , (replicate('h', 900))
  , (replicate('i', 900))
  , (replicate('j', 900))
;
go
set STATISTICS io on
go
select * from #t with (index = t_i1) where c = 'i';
select * from #t with (index = t_i2) where c = 'i';
go
set STATISTICS io off
go
drop table #t;
7 окт 16, 11:21    [19754245]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
Yayaadmin
Guest
o-o
Yayaadmin
пропущено...


А здесь можно подробнее, зачем сервер выполнит еще чтение, если он уже прочитал страницу и должен был за раз все вытащить?

если у вас туча повторяющихся значений
и они не влазят на одну страницу индекса,
то прочтет еще столько страниц, сколько занято под эти значения,
не только одну


Эт я знаю (двунаправленный список), было написано "(может понадобиться одно лишнее чтение, если найденная запись находится в самом конце страницы)" не на другой, а именно в конце страницы, вот и спросил.
7 окт 16, 11:22    [19754258]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
немного не в тему, но интересная http://www.sqlpassion.at/archive/2010/08/31/unique-and-non-unique-non-clustered-indexes-on-a-unique-clustered-index/
7 окт 16, 11:24    [19754262]     Ответить | Цитировать Сообщить модератору
 Re: Число просмотров в statistic io  [new]
Yayaadmin
Guest
daw
Yayaadmin,

> А здесь можно подробнее, зачем сервер выполнит еще чтение, если он уже прочитал страницу и должен был за раз все вытащить?

если найденная запись в самом конце страницы, а индекс не объявлен уникальным, ему придется прочитать следующую страницу, чтобы проверить, что там нет еще одного такого же (как найденное) значения. в случае с уникальным индексом этого делать нет необходимости.
create table #t (c varchar(900));
go
create index t_i1 on #t(c);
go
create unique index t_i2 on #t(c);
go
insert into #t (c) values 
  (replicate('a', 900))
  , (replicate('b', 900))
  , (replicate('c', 900))
  , (replicate('d', 900))
  , (replicate('e', 900))
  , (replicate('f', 900))
  , (replicate('g', 900))
  , (replicate('h', 900))
  , (replicate('i', 900))
  , (replicate('j', 900))
;
go
set STATISTICS io on
go
select * from #t with (index = t_i1) where c = 'i';
select * from #t with (index = t_i2) where c = 'i';
go
set STATISTICS io off
go
drop table #t;


Теперь ясно, спасибо.
7 окт 16, 11:24    [19754263]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить