Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 数据库优化顾问建议创建现有索引_Sql Server_Sql Server 2005_Indexing - Fatal编程技术网

Sql server 数据库优化顾问建议创建现有索引

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

当我运行SQLServer2005DatabaseTuning 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;

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

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所做记录的详细信息吗。我想你会发现它们是不同的