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

Откуда:
Сообщений: 88
Опять же день добрый!
Подскажите что лучше (для скорости) использовать один составной индекс:
CREATE NONCLUSTERED INDEX [myIdx] ON [dbo].[tbl]
(
	[fld1] ASC,
	[fld2] ASC,
	[fld3] ASC,
	[fld4] ASC,
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
или 4 (в данном случае) отдельных:
CREATE NONCLUSTERED INDEX [myIdx1] ON [dbo].[tbl]
(
	[fld1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
CREATE NONCLUSTERED INDEX [myIdx2] ON [dbo].[tbl]
(
	[fld2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
CREATE NONCLUSTERED INDEX [myIdx3] ON [dbo].[tbl]
(
	[fld3] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
CREATE NONCLUSTERED INDEX [myIdx4] ON [dbo].[tbl]
(
	[fld4] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

В запросах используется и полное условие (по всем 4 полям) и отдельно по 3, 2, 1...
2 авг 17, 16:14    [20695430]     Ответить | Цитировать Сообщить модератору
 Re: Один индекс или несколько  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Badhabit,

Для какой скорости? Чтения или записи?
2 авг 17, 16:23    [20695485]     Ответить | Цитировать Сообщить модератору
 Re: Один индекс или несколько  [new]
Badhabit
Member

Откуда:
Сообщений: 88
Remind
Badhabit,

Для какой скорости? Чтения или записи?

чтения. Делаю обычный select
2 авг 17, 16:25    [20695501]     Ответить | Цитировать Сообщить модератору
 Re: Один индекс или несколько  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
Всё зависит от типов запросов на чтение и их количества.

Составной индекс может использоваться, если известны данные с его начала. Например, WHERE fld1 = 123. Или WHERE fld1 = 123 AND fld2 = 456. Однако, он бесполезен, если начало не указано. Например, WHERE fld2 = 456. Тем не менее, даже в этом случае сделать фулскан индекса может быть проще, чем фулскан таблицы. Индекс может банально занимать сильно меньше дисковых блоков, что зависит от типов и размеров полей. Потому его дешевле всосать в память.

Разумеется, составной индекс гораздо эффективнее отдельных, если указаны все четыре поля.

Дальше надо смотреть запросы на изменение. Если поля в индексе часто меняются, что вызывает его перестроение, да ещё в длинных транзакциях, это вызовет блокировки. Вплоть до дедлоков при особом умении программировать. Тут составной индекс может создать больше проблем, чем четыре отдельных.

Отсюда вывод: надо мерять на конкретной боевой системе с реальными данными.
2 авг 17, 16:28    [20695522]     Ответить | Цитировать Сообщить модератору
 Re: Один индекс или несколько  [new]
iii2
Member

Откуда:
Сообщений: 202
Badhabit,
Индекс по полям
[fld1] ASC,
[fld2] ASC,
[fld3] ASC,
[fld4] ASC
с точки зрения сравнений с полем [fld1] будет эквивалентен индексу по полю
[fld1] ASC
Но не будет работать для сравнений только с полем [fld2] (ну, имеется ввиду seek не будет делать).

Вывод: Это неэвивалентные структуры.
Могут понадобиться и те и другие.
... или не понадобиться вообще.
2 авг 17, 16:32    [20695538]     Ответить | Цитировать Сообщить модератору
 Re: Один индекс или несколько  [new]
o-o
Guest
iii2
Индекс по полям
[fld1] ASC,
[fld2] ASC,
[fld3] ASC,
[fld4] ASC
с точки зрения сравнений с полем [fld1] будет эквивалентен индексу по полю
[fld1] ASC
.

Да ладно.
Вы не знаете типы его полей.
А ведь могут быть такие:
Fld1 int
Fld2 char(200)
Fld3 char(300)
Fld4 char(250)

Причем в запросе, в части SELECT, вообще не просят fld2, 3,4.
Думаете, сервер позарится на второй индекс, если ему еще какие-то поля надо лукапить?
Я что-то думаю, пойдет таблицу сканить.
А первый индекс с удовольствием задействует
2 авг 17, 18:31    [20695943]     Ответить | Цитировать Сообщить модератору
 Re: Один индекс или несколько  [new]
Badhabit
Member

Откуда:
Сообщений: 88
Спасибо большое! Стал понятен принцип!
3 авг 17, 08:40    [20696813]     Ответить | Цитировать Сообщить модератору
 Re: Один индекс или несколько  [new]
iii2
Member

Откуда:
Сообщений: 202
o-o
iii2
Индекс по полям
[fld1] ASC,
[fld2] ASC,
[fld3] ASC,
[fld4] ASC
с точки зрения сравнений с полем [fld1] будет эквивалентен индексу по полю
[fld1] ASC
.

Да ладно.
Вы не знаете типы его полей.
А ведь могут быть такие:
Fld1 int
Fld2 char(200)
Fld3 char(300)
Fld4 char(250)

Причем в запросе, в части SELECT, вообще не просят fld2, 3,4.
Думаете, сервер позарится на второй индекс, если ему еще какие-то поля надо лукапить?
Я что-то думаю, пойдет таблицу сканить.
А первый индекс с удовольствием задействует

А почему так?
Не понимаю.
3 авг 17, 11:04    [20697257]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить