Sql server 数据库优化顾问建议创建现有索引
当我运行SQLServer2005DatabaseTuning Advisor时,它会建议创建一个索引,但它会建议索引一个已经有索引的列。为什么它会建议再次创建相同的索引 以下是我的SQL:Sql server 数据库优化顾问建议创建现有索引,sql-server,sql-server-2005,indexing,Sql Server,Sql Server 2005,Indexing,当我运行SQLServer2005DatabaseTuning Advisor时,它会建议创建一个索引,但它会建议索引一个已经有索引的列。为什么它会建议再次创建相同的索引 以下是我的SQL: SELECT t.name AS 'affected_table' , 'Create NonClustered Index IX_' + t.name + '_' + CAST(ddmid.index_handle AS VARCHAR(10)) + ' On ' + ddmid.STA
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;
您可能需要运行查询并建议已经存在的索引
SELECT * FROM table WITH INDEX(IX_INDEX_SHOULD_BE_USED) WHERE x = y
在SQL Server中,存在的索引可能不会被认为是有用的。运行建议需要索引的查询,查看SQL Server中的执行路径,然后构建所需的其他索引。能否列出完整的索引缺失警告消息?通常,它要求在表上创建一个索引,但只返回某些字段,而不是在表上创建一个索引,默认情况下该索引将返回所有字段。也许可以尝试“DESC”以不同的方式排序
这在另一个类似的问题中起了作用 继续编写当前索引结构的详细信息,然后将其与DTA的推荐内容进行比较
我怀疑你会发现结果中存在结构性差异。我不认为海报上说他的查询没有使用索引。他说sql server建议他针对特定表生成索引。问题是,该表中已经有一个针对这些字段的索引(他相信)。如果他没有特别指定索引,SQL server将尝试使用它对该项感觉最好的索引。它可能存在,但SQL server忽略了它,因此SQL server认为它需要相同的索引。从带有(索引(应使用IX_索引))的表中选择*,其中x=yWhy已标记?SQL Server将具有相同列但排序顺序不同的索引视为“不同”索引。这是一个可能的解决方案,原始海报需要提供当前的索引定义和DTA建议的索引定义。@John:我对我的最后5个答案投了5次反对票。。。我似乎让一些人感到不安:-)您可以提供您当前索引结构(即,编写索引构建语句)和DTA所做记录的详细信息吗。我想你会发现它们是不同的