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

Откуда: Москва
Сообщений: 2646
На таблице построены индексы на каждом поле отдельно, на некоторых полях индекс отсутствует.
Имеет ли значение порядок следования полей в условии WHERE на то, будет ли использованы индексы или нет?

Ниже, нашел описание только для составного индекса
В создании композитного (сложного) индекса участвуют несколько полей таблицы. При создании индекса следует обращать внимание на порядок следования полей в индексе.
Например, если создается индекс по полям Field1, Field2, то он может быть применен только в запросе, где в критериях используются оба этих поля. Также этот индекс будет полезен для условий, построенных для одного Field1. Для одного Field2 этот индекс не может быть применен.
Если в дополнение к индексу по полям Field1, Field2 добавить индекс по полям Field2, Field1, то SQL Server при построении плана запроса будет анализировать, какой из них более селективен в применении к ограничениям на условия запроса. Последний момент в построении композитного индекса по полям Field1, Field2 – он не равен сумме индексов по указанным полям. В случае, когда в запросе могут быть использованы оба поля как критерий поиска при раздельных индексах по полям, будет построено пересечение по индексам, что медленнее чем выборка из композитного индекса.
20 ноя 14, 17:16    [16880326]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
daw
Member

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

в условии WHERE - нет, не имеет.
20 ноя 14, 17:20    [16880358]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
trew,

Будет использован только один из всех индексов, ну и еще key\rid lookup
20 ноя 14, 17:20    [16880361]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
Glory
Member

Откуда:
Сообщений: 104751
trew
Имеет ли значение порядок следования полей в условии WHERE на то, будет ли использованы индексы или нет?

Ну так where бывают разные
where f1 =@v1 and f2 = @v2
where f1 =@v1 or f2 = @v2
20 ноя 14, 17:22    [16880381]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
daw
Member

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

Будет использован только один из всех индексов, ну и еще key\rid lookup


вообще говоря, совсем не обязательно только один.
20 ноя 14, 17:32    [16880468]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Glory
trew
Имеет ли значение порядок следования полей в условии WHERE на то, будет ли использованы индексы или нет?

Ну так where бывают разные
where f1 =@v1 and f2 = @v2
where f1 =@v1 or f2 = @v2

для случая
where f1 =@v1 and f2 = @v2
где для поля f1 - нет индекса, а на поле f2 - некластерный индекс. Например, f2 - это номера заказов.

Будет ли использован сервером индекс на поле f2 ? или в каких-то случаях будет, а в других нет?
20 ноя 14, 17:35    [16880498]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
daw
WarAnt
trew,

Будет использован только один из всех индексов, ну и еще key\rid lookup


вообще говоря, совсем не обязательно только один.


Да согласен, в случае or может использовать и больше одного.
20 ноя 14, 17:37    [16880516]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
Glory
Member

Откуда:
Сообщений: 104751
trew
Будет ли использован сервером индекс на поле f2 ? или в каких-то случаях будет, а в других нет?

Это зависит от многих факторов. А не только от следования выражений в тексте запроса
20 ноя 14, 17:37    [16880519]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
trew
Будет ли использован сервером индекс на поле f2 ?

Возможно будет
trew
или в каких-то случаях будет, а в других нет?

Это зависит от статистики, если оптимизатору посчитается что проще будет просканировать всю кучу (а это зависит в том числе и от того какой набор полей вы собираетесь возвращать) то он проигнорирует ваш индекс.
20 ноя 14, 17:41    [16880554]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Спасибо за ответы.

Я понял, что если первое поле в условии WHERE без индекса,
то это не мешает серверу использовать индексы для остальных полей когда сервер сочтёт целесообразным это.
20 ноя 14, 17:48    [16880615]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
WarAnt
daw
пропущено...


вообще говоря, совсем не обязательно только один.


Да согласен, в случае or может использовать и больше одного.


и в случае and тоже может.

drop table #t;
go
create table #t (c1 int, c2 int);
create index idx_c1 on #t (c1);
create index idx_c2 on #t (c2);

insert into #t select top (100) 1, 1 from sys.objects o cross join sys.objects o2;;
insert into #t select top (100) 1, 2 from sys.objects o cross join sys.objects o2;;
insert into #t select top (100) 2, 1 from sys.objects o cross join sys.objects o2;;
insert into #t select top (10000) 3, 3 from sys.objects o cross join sys.objects o2;

set statistics profile on;
go
select c1, c2 from #t where c1 = 1 and c2 = 2
go
set statistics profile off;

--100	1	select c1, c2 from #t where c1 = 1 and c2 = 2	1	1	0	NULL	NULL	NULL	NULL	13,93466	NULL	NULL	NULL	0,02788627	NULL	NULL	SELECT	0	NULL
--100	1	  |--Hash Match(Inner Join, HASH:([Bmk1000])=([Bmk1000]), RESIDUAL:([Bmk1000] = [Bmk1000]))	1	3	1	Hash Match	Inner Join	HASH:([Bmk1000])=([Bmk1000]), RESIDUAL:([Bmk1000] = [Bmk1000])	NULL	1,941748	0	0,02098927	15	0,02788627	[tempdb].[dbo].[#t].[c2], [tempdb].[dbo].[#t].[c1]	NULL	PLAN_ROW	0	1
--100	1	       |--Index Seek(OBJECT:([tempdb].[dbo].[#t]), SEEK:([tempdb].[dbo].[#t].[c2]=(2)) ORDERED FORWARD)	1	4	3	Index Seek	Index Seek	OBJECT:([tempdb].[dbo].[#t]), SEEK:([tempdb].[dbo].[#t].[c2]=(2)) ORDERED FORWARD	[Bmk1000], [tempdb].[dbo].[#t].[c2]	100	0,003125	0,000267	19	0,003392	[Bmk1000], [tempdb].[dbo].[#t].[c2]	NULL	PLAN_ROW	0	1
--200	1	       |--Index Seek(OBJECT:([tempdb].[dbo].[#t]), SEEK:([tempdb].[dbo].[#t].[c1]=(1)) ORDERED FORWARD)	1	5	3	Index Seek	Index Seek	OBJECT:([tempdb].[dbo].[#t]), SEEK:([tempdb].[dbo].[#t].[c1]=(1)) ORDERED FORWARD	[Bmk1000], [tempdb].[dbo].[#t].[c1]	200	0,003125	0,000377	19	0,003502	[Bmk1000], [tempdb].[dbo].[#t].[c1]	NULL	PLAN_ROW	0	1
20 ноя 14, 17:59    [16880714]     Ответить | Цитировать Сообщить модератору
 Re: порядок следования полей в индексе  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
trew
Спасибо за ответы.

Я понял, что если первое поле в условии WHERE без индекса,
то это не мешает серверу использовать индексы для остальных полей когда сервер сочтёт целесообразным это.
Важен порядок следования полей в индексе, а не в выражении WHERE. Ну а дальше селективность. Какой индекс сервер посчитает более селективным, тот и будет использоваться. В редких случаях он может использовать несколько индексов для одной таблицы.

trew
На таблице построены индексы на каждом поле отдельно, на некоторых полях индекс отсутствует.
Не факт что все эти индексы на одиночных полях используются, посмотрите лучше статистику использования индексов - sys.dm_db_index_usage_stats
20 ноя 14, 20:57    [16881653]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить