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

Откуда:
Сообщений: 1366
Здравствуйте.
Есть такая ситуация:
запрос
-- Отсутствующие индексы, вызывающие издержки
SELECT TOP 100 
       [Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0),
       avg_user_impact,
       TableName = statement,
       [EqualityUsage] = equality_columns,
       [InequalityUsage] = inequality_columns,
       [Include Columns] = included_columns,
       [CreateTxt] = 'CREATE INDEX ' + QuoteName('IX_' + Object_Name(d.object_id,d.database_id) + '_' 
			+ Replace(Replace(Replace(isnull(equality_columns,''),'], [','_'),']',''),'[',''))
			+ ' ON ' + isnull(d.[statement],'') + ' (' + isnull(equality_columns,'') + ')'
			+ ' INCLUDE (' + isnull(d.included_columns,'') + ')'
  FROM sys.dm_db_missing_index_groups g 
	INNER JOIN sys.dm_db_missing_index_group_stats s ON s.group_handle = g.index_group_handle 
	INNER JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle
  WHERE database_id = DB_ID()
  ORDER BY [Total Cost] DESC;


говорит, что на таблице А отсутствует индекс:

CREATE INDEX [IX_A_Block_Status] ON [CZ_New].[dbo].[A] ([Block], [Status]) INCLUDE ([keyA])

Однако, в базе данных присутствует более широкий индекс
CREATE INDEX [IX_A_Block_Status_Dat] ON [CZ_New].[dbo].[A] ([Block], [Status], [dat]) INCLUDE ([keyA])

И если выполнять запрос
SELECT A.keyA
FROM A
WHERE Block=2 AND Status=3


то план запроса показывает, что происходит IndexSeek по индексу IX_A_Block_Status_Dat

Вопрос - нужен ли индекс IX_A_Block_Status или же достаточно индекса IX_A_Block_Status_Dat ?
Если достаточно, то почему запрос запрос говорит, что именно он нужен?
14 июн 18, 18:54    [21491918]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли индекс?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
Диам,

"на заборе тоже много чего написано, я заглядывала - там только дрова"(с) (какой-то старый анекдот)

не нужно слепо верить даже тому, что выдает оптимизатор / профайлер (не говоря уже про подозрительные скрипты из непонятного источника). Любые рекомендации - они, именно что, рекомендации. Применять их или нет - решает не скрипт, а человек. Вам лишь дали пищу для размышления. А нужно оно или нет - решать только вам. Тут нужно смотреть на состав данных, их распределение и характер обработки (соотношение операций DML и обычных SELECT), а также - на полный набор запросов, которые потенциально могут использовать новый индекс. НА крайний случай - сделайте пару вариантов индекса и посмотрите на статистику их использования. Вполне может оказаться, что оба будут использоваться интенсивно. Либо наоборот - оба индекса окажутся малопригодными и редкоиспользуемыми...
14 июн 18, 19:13    [21491961]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли индекс?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
Диам,

более широкий индекс "хуже" тем, что он шире :) больше читать нужно.
оптимизатор конечно хочет более оптимальный (узкий).
то что идёт поиск по существующему... ну, дак, а чего бы ему не идти на таком запросе.

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

если широкий построен не просто так, а используется в других запросах, то может статься,
что оставить только его будет правильно (меньше индексов - меньше накладных расходов)
смотрите весь набор запросов на таблицу
14 июн 18, 21:45    [21492307]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли индекс?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Диам,

обычно такое "отсуствие индекса" не должно предлогать, разве что селективность вмесе с dat сильно отличается
15 июн 18, 09:07    [21492711]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить