【问题标题】:Database Tuning Advisor recommends to create an existing indexDatabase Tuning Advisor 建议创建现有索引
【发布时间】:2010-11-09 23:18:36
【问题描述】:

当我运行 SQL Server 2005 Database Tuning Advisor 时,它会建议创建索引,但它会建议对已经有索引的列进行索引。为什么它会建议再次创建相同的索引?

这是我的 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;

【问题讨论】:

标签: sql-server sql-server-2005 indexing


【解决方案1】:

您可能需要运行查询并建议已经存在的索引。

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

那里的索引可能不被认为对 SQL Server 有用。运行提示需要索引的查询,查看 SQL Server 中的执行路径,然后构建其他需要的索引。

【讨论】:

  • 我不认为发帖者说他的查询不使用索引。他说 sql server 建议他针对特定表生成索引。问题是,该表上已经有针对这些字段的索引(他认为)。
  • 如果他没有明确指定索引,SQL 服务器会尝试使用它认为的项目的最佳索引。它可能存在,但 SQL Server 忽略了它,因此 SQL Server 认为它需要相同的索引。
  • SELECT * FROM table WITH(INDEX(IX_INDEX_SHOULD_BE_USED)) WHERE x = y
【解决方案2】:

您能否列出完整的索引缺失警告消息?通常,它要求在表上创建索引但只返回某些字段,而不是表上的索引,默认情况下会返回所有字段。

【讨论】:

    【解决方案3】:

    也许尝试“DESC”以不同的方式订购?

    这适用于另一个类似的 SO 问题...Why does SQL Server 2005 Dynamic Management View report a missing index when it is not?

    【讨论】:

    • 为什么这个被降价了? SQL Server 将具有相同列但排序顺序不同的索引视为“不同”索引。这是一个可能的解决方案,原始发布者需要提供当前索引定义和 DTA 建议的定义。
    • @John:我的最后 5 个答案有 5 个连续的否决票......我似乎让某人不高兴:-)
    【解决方案4】:

    继续编写当前索引结构的详细信息,然后将其与 DTA 的建议进行比较。

    我怀疑您会发现结果存在结构差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2021-05-06
      • 2023-03-27
      相关资源
      最近更新 更多