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

Но есть ли преимущества CLUSTERED INDEX SCAN перед TABLE SCAN ?
Возможно ли частичное сканирование в первом случае?
26 янв 14, 14:25    [15470656]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Glory
Member

Откуда:
Сообщений: 104760
Score
Но есть ли преимущества CLUSTERED INDEX SCAN перед TABLE SCAN ?

Кластерный индекс и есть таблица

Score
Возможно ли частичное сканирование в первом случае?

Что такое частичное сканирование ?
26 янв 14, 14:52    [15470732]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Дядя Йося
Guest
Score,

нету никакой разницы абсолютно. скан бывает только от начала до конца. index seek может выполняться как range scan
26 янв 14, 14:53    [15470734]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Score
Guest
Glory
Score
Возможно ли частичное сканирование в первом случае?

Что такое частичное сканирование ?
вопрос возник из следующих размышлений:
К примеру, есть кластерный индекс по одному полю. Выполняется запрос с условием выбирающим некоторый диапазон этого поля, в который попадает бОльшая часть записей. Оптимизатор принимает решение выполнять скан кластереного индекса.

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

Т.е. будет ли инструкция SCAN принимать в расчет, что она перебирает упорядоченные записи?
26 янв 14, 16:14    [15470912]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Шломо Кац
Guest
Score

Т.е. будет ли инструкция SCAN принимать в расчет, что она перебирает упорядоченные записи?


Если оптимизатор выбрал SCAN, будь уверен, этот оператор умеет только сканировать от начала до конца.

В твоем случае оптимизатор, возможно, выберет Index Seek (RANGE SCAN).
26 янв 14, 18:27    [15471228]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Score
Guest
Шломо Кац
Если оптимизатор выбрал SCAN, будь уверен, этот оператор умеет только сканировать от начала до конца.

В твоем случае оптимизатор, возможно, выберет Index Seek (RANGE SCAN).
Что-то все ссылки гугла о RANGE SCAN ведут к Ораклу. Можно ссылочку с описанием?
26 янв 14, 19:18    [15471419]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Саид Абдул Азиз
Guest
Score
Можно ссылочку с описанием?


+ пример

with
l0(n) as (select 1 union all select 1),
l1(n) as (select 1 from l0 t1, l0 t2),
l2(n) as (select 1 from l1 t1, l1 t2),
l3(n) as (select 1 from l2 t1, l2 t2),
l4(n) as (select 1 from l3 t1, l3 t2),
l5(n) as (select 1 from l4 t1, l4 t2),
rt(n) as (select row_number() over(order by (select 0)) from l5)
select top(1000000) n as id, cast('a' as nchar(10)) as data
into #t
from
	rt;
go

create unique clustered index #uidx_t_id on #t(id);
go

set showplan_text on;
go

select
	count(1)
from
	#t
where
	5<= #t.id and #t.id <= 800000
go

set showplan_text off;
go



|--Compute Scalar(DEFINE:([Expr1003]=CONVERT_IMPLICIT(int,[Expr1004],0)))
|--Stream Aggregate(DEFINE:([Expr1004]=Count(*)))
|--Clustered Index Seek(OBJECT:([tempdb].[dbo].[#t]), SEEK:([tempdb].[dbo].[#t].[id] >= (5) AND [tempdb].[dbo].[#t].[id] <= (800000)) ORDERED FORWARD)

26 янв 14, 19:29    [15471461]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Score
Guest
Мустафа
+ пример

with
l0(n) as (select 1 union all select 1),
l1(n) as (select 1 from l0 t1, l0 t2),
l2(n) as (select 1 from l1 t1, l1 t2),
l3(n) as (select 1 from l2 t1, l2 t2),
l4(n) as (select 1 from l3 t1, l3 t2),
l5(n) as (select 1 from l4 t1, l4 t2),
rt(n) as (select row_number() over(order by (select 0)) from l5)
select top(1000000) n as id, cast('a' as nchar(10)) as data
into #t
from
	rt;
go

create unique clustered index #uidx_t_id on #t(id);
go

set showplan_text on;
go

select
	count(1)
from
	#t
where
	5<= #t.id and #t.id <= 800000
go

set showplan_text off;
go



|--Compute Scalar(DEFINE:([Expr1003]=CONVERT_IMPLICIT(int,[Expr1004],0)))
|--Stream Aggregate(DEFINE:([Expr1004]=Count(*)))
|--Clustered Index Seek(OBJECT:([tempdb].[dbo].[#t]), SEEK:([tempdb].[dbo].[#t].[id] >= (5) AND [tempdb].[dbo].[#t].[id] <= (800000)) ORDERED FORWARD)

ок, вижу seek
т.е. range scan - это не термин ms sql ?
26 янв 14, 19:45    [15471494]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31443
Score
ок, вижу seek
т.е. range scan - это не термин ms sql ?
Да, будет написано index seek
Скан может быть частичным для выборки с top или в exists
26 янв 14, 19:47    [15471498]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Score
Guest
alexeyvg
Скан может быть частичным для выборки с top или в exists
но, я так понимаю, в этом случае, в сравнении с TABLE SCAN отличий не будет
26 янв 14, 19:51    [15471501]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Score
Guest
alexeyvg
Да, будет написано index seek
т.е. будет написано INDEX SEEK, хотя фактически механика будет аналогичная SCAN, но для диапазона?
26 янв 14, 19:53    [15471504]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Салех аль Азиз
Guest
Score
ок, вижу seek
т.е. range scan - это не термин ms sql ?


без понятия. так ли это важно?
26 янв 14, 20:29    [15471591]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31443
Score
т.е. будет написано INDEX SEEK, хотя фактически механика будет аналогичная SCAN, но для диапазона?
Не аналогична, потому что будет поиск начала этого диапазона.
26 янв 14, 20:36    [15471605]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Мохамед бен Дауд
Guest
Score
alexeyvg
Да, будет написано index seek
т.е. будет написано INDEX SEEK, хотя фактически механика будет аналогичная SCAN, но для диапазона?


да
26 янв 14, 20:40    [15471616]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Абу-Хамза
Guest
alexeyvg
Score
т.е. будет написано INDEX SEEK, хотя фактически механика будет аналогичная SCAN, но для диапазона?
Не аналогична, потому что будет поиск начала этого диапазона.


да. но не всегда. пример - сразу по листьям.

select
	count(1)
from
	#t
where
	id < 5000



|--Compute Scalar(DEFINE:([Expr1003]=CONVERT_IMPLICIT(int,[Expr1004],0)))
|--Stream Aggregate(DEFINE:([Expr1004]=Count(*)))
|--Clustered Index Seek(OBJECT:([tempdb].[dbo].[#t]), SEEK:([tempdb].[dbo].[#t].[id] < (5000)) ORDERED FORWARD)
26 янв 14, 20:45    [15471630]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Абу-Хамза
Guest
Абу-Хамза
alexeyvg
пропущено...
Не аналогична, потому что будет поиск начала этого диапазона.


да. но не всегда. пример - сразу по листьям.

select
	count(1)
from
	#t
where
	id < 5000



|--Compute Scalar(DEFINE:([Expr1003]=CONVERT_IMPLICIT(int,[Expr1004],0)))
|--Stream Aggregate(DEFINE:([Expr1004]=Count(*)))
|--Clustered Index Seek(OBJECT:([tempdb].[dbo].[#t]), SEEK:([tempdb].[dbo].[#t].[id] < (5000)) ORDERED FORWARD)


пардон. он и в этом случае спускается сверху вниз.
26 янв 14, 20:55    [15471658]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Score
Guest
Абу-Хамза,
Я не понял. Объясни, плиз, почему ты передумал
26 янв 14, 21:17    [15471763]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Абу-Хамза
Guest
Score,

увеличил число строк в тесте, чтобы высота кластерного индекса увеличилась хотя бы до 3. уменьшил число в предикате до id < 5. все записи из примера попадающие в этот диапазон, должны попасть в одну страницу.

с помощью extended events посмотрел какие физические читаются, было поднято с диска 2 екстента (2*8 страниц) среди них (можно видеть с помощью dbcc page):

level 2 (рут)
level 1
level 0 (листья)

я надеялся увидеть поднятым один екстент со страницами принадлежащими только уровню 0.

да и set statistics io on;

дает

3 логических и 2 физических чтения.

3 логических потому что высота индекса 3 и он проходит по страницам сверху вниз (путь из трех страниц), а 2 физических, потому что считывалось все екстентами.
26 янв 14, 21:57    [15471885]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Абу-Хамза
Guest
http://technet.microsoft.com/en-us/library/aa174523(v=sql.80).aspx

For a clustered index, sysindexes.root points to the top of the clustered index. SQL Server navigates down the index to find the row corresponding to a clustered index key. To find a range of keys, SQL Server navigates through the index to find the starting key value in the range, and then scans through the data pages using the previous or next pointers. To find the first page in the chain of data pages, SQL Server follows the leftmost pointers from the root node of the index.


А по другому и не может быть. И в случае SCAN тоже спустится по крайней левой (правой back scan) ветке к крайнему левому (правому) leaf листу и оттуда начнет сканить по листьям вперед (назад)
26 янв 14, 22:49    [15472022]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
Score
Guest
Абу-Хамза,
риспект!
27 янв 14, 14:07    [15475160]     Ответить | Цитировать Сообщить модератору
 Re: Преимущества CLUSTERED INDEX SCAN перед TABLE SCAN  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Вообще, по-другому может быть, есть еще allocation order scan, merry-go-round scan.
27 янв 14, 14:32    [15475395]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить