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

Откуда:
Сообщений: 384
Добрый день. Посоветуйте, как лучше создавать индексы?

Использую запросы к DMV. К примеру, для одной таблицы T1 по запросу видно, что рекомендуется создать два индекса

T1 (Col1, Col2)
T1 (Col2, Col3) INCLUDE (Col1)

как лучше делать - создать оба индекса или сделать один такой - T1 (Col1, Col2, Col3)?
29 сен 11, 12:46    [11354291]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ваш "один такой" никак не поможет в случае, когда нужен индекс T1 (Col2, Col3) INCLUDE (Col1).
29 сен 11, 12:49    [11354318]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
temp-for-testing,

это разные индексы и помогут они в разных запросах...
29 сен 11, 12:50    [11354329]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Для разных запросов могут понадобиться разные индексы.

Например, для такого:
select Col1, Col2
from ...
where Col1 = .. and Col2 > ...
первый индекс

А вот для такого:
select Col1
from ...
where Col2 = .. and Col3 = ...
второй. (Col1, Col2, Col3) этому запросу не поможет.
29 сен 11, 12:51    [11354346]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
Ray D,

большое спасибо! теперь понял
29 сен 11, 12:54    [11354377]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
а в таком случае как лучше поступить?

предлагается создать два индекса

T1 (Col1, Col2)
T1 (Col1, Col3)

создаю такие индексы:

create index T12 on T (col1, col2)

create index T13 on T (col1, col3)

create index T123 on T (col1, col2, col3)

выполняю два запроса

select col1 from T
where col1 = 1 and col2 = 1 

select col1 from T
where col1 = 1 and col3 = 1


в первом запросе используется T123, в втором T13.

удаляю T13 - в обоих запросах используется T123.

логически я понимаю, что для второго запроса предпочтительнее индекс T13, но с другой стороны T12 и T13 занимают по 40 кб, а T123 - 48 (на тестовой таблице), т.е. использование одного индекса T123 со стороны занимаемого места более предпочтительное (и для вставки/обновления таблицы один индекс лучше), но какой вариант лучше? и еще - почему T12 не используется?
29 сен 11, 14:24    [11355330]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
temp-for-testing,
вот поэтому создание индексов нужно взвешивать с различных сторон:
для каких это запросов, их частота выполнения, время выполнения и разница при различных индексах и т.д.
и решать идти на быструю выборку, использую много индексов, или оставить оптимальное их кол-во, чтобы select был приемленный, и update с delete не такими долгими, т.к сказать золотая середина.
29 сен 11, 15:19    [11355935]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
temp-for-testing
Member

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

понятно.. а вот еще одно (просто интересно) - почему в этом примере для первого запроса использовался индекс с тремя полями? ведь в запросе только два поля присутствуют и есть индекс именно для этих двух полей. насколько я понимаю, чем больше полей в индексе, тем более затратно его использовать
29 сен 11, 15:25    [11356001]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
iljy
Member

Откуда:
Сообщений: 8711
temp-for-testing,

а сколько записей в таблице? Я вляются ли индексы уникальными? Кластерными? Статистика по ним актуальная?
29 сен 11, 15:34    [11356149]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
temp-for-testing
Member

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

записей 1000, таблицу специально создал для теста, все индексы неуникальные, кластерных индексов нет. просто создал таблицу, загнал туда 1000 записей, создал индексы и запустил запросы. сейчас удалил все индексы и создал заново в другом порядке, т.е. сначала T123, потом T12, потом T13. в итоге, для первого запроса теперь используется индекс T12 (видимо, как самый свежий, что ли)
29 сен 11, 15:41    [11356240]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
trew
Member

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

командой DBCC можно очистить буфер данных
DBCC DROPCLEANBUFFERS

чтобы эксперимент был "чистый". Может статистику обновить ещё.
29 сен 11, 15:46    [11356294]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов с помощью DMV  [new]
temp-for-testing
Member

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

понятно.. спасибо!
29 сен 11, 15:50    [11356337]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить