Помощник по настройке базы данных рекомендует создать существующий индекс

Когда я запускаю помощник по настройке базы данных SQL Server 2005, он дает рекомендацию по созданию индекса, но рекомендует индексировать столбец, в котором уже есть индекс. Почему он дает рекомендацию снова создать тот же индекс?

Вот мой SQL:

SELECT t.name AS 'affected_table'
  , 'Create NonClustered Index IX_' + t.name + '_' 
   + CAST(ddmid.index_handle AS VARCHAR(10))
   + ' On ' + ddmid.STATEMENT 
   + ' (' + IsNull(ddmid.equality_columns,'') 
   + CASE 
     WHEN ddmid.equality_columns IS NOT NULL 
          AND ddmid.inequality_columns IS NOT NULL
     THEN ',' 
     ELSE '' 
     END 
   + ISNULL(ddmid.inequality_columns, '')
   + ')' 
   + ISNULL(' Include (' + ddmid.included_columns + ');', ';') 
  AS sql_statement
  , ddmigs.user_seeks
  , ddmigs.user_scans
  , CAST((ddmigs.user_seeks + ddmigs.user_scans) 
    * ddmigs.avg_user_impact AS INT) AS 'est_impact'
  , ddmigs.last_user_seek
FROM 
  sys.dm_db_missing_index_groups AS ddmig
  INNER JOIN sys.dm_db_missing_index_group_stats AS ddmigs
    ON ddmigs.group_handle = ddmig.index_group_handle
  INNER JOIN sys.dm_db_missing_index_details AS ddmid 
    ON ddmig.index_handle = ddmid.index_handle
  INNER Join sys.tables AS t
    ON ddmid.OBJECT_ID = t.OBJECT_ID
WHERE 
  ddmid.database_id = DB_ID()
  AND CAST((ddmigs.user_seeks + ddmigs.user_scans) 
  * ddmigs.avg_user_impact AS INT) > 100
ORDER BY 
  CAST((ddmigs.user_seeks + ddmigs.user_scans) 
  * ddmigs.avg_user_impact AS INT) DESC;

4 ответа

Решение

Может, попробовать "DESC" заказать по-другому?

Это сработало в другом подобном вопросе SO... Почему SQL Server 2005 Dynamic Management View сообщает об отсутствующем индексе, если это не так?

Идите вперед и напишите подробности обоих ваших текущих структур индексов, а затем сравните это с рекомендациями, сделанными DTA.

Я подозреваю, что вы обнаружите структурные различия в результатах.

Возможно, вам придется выполнить ваши запросы и предложить индекс, который уже существует.

SELECT * FROM table WITH INDEX(IX_INDEX_SHOULD_BE_USED) WHERE x = y

Указанный индекс не может считаться полезным для SQL Server. Запустите запрос, который предлагает потребность в индексе и посмотрите путь выполнения в SQL Server, а затем создайте другие необходимые индексы.

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

Другие вопросы по тегам