SQL Server中复杂主键上的表索引

SQL Server中复杂主键上的表索引,sql,sql-server,Sql,Sql Server,我的数据库中有以下表格 使用者 地位 状态选择器 statusToUser用作其他两个之间的链接表,用于多对多关系 表定义如下所示: 用户Id 身份证 这些列是表的主键,并且有一个单独的索引来保存这两个列,但是当对“缺少的查询”运行查询优化时,我在列表中得到了添加另一个索引的建议 问题是,我真的需要在该列上添加另一个索引吗 谢谢 编辑: 这是两个不同的查询,采用相同的方法: SELECT user_seeks * avg_total_user_cost * ( avg_user_imp

我的数据库中有以下表格

  • 使用者
  • 地位
  • 状态选择器
statusToUser用作其他两个之间的链接表,用于多对多关系

表定义如下所示:

  • 用户Id
  • 身份证
这些列是表的主键,并且有一个单独的索引来保存这两个列,但是当对“缺少的查询”运行查询优化时,我在列表中得到了添加另一个索引的建议

问题是,我真的需要在该列上添加另一个索引吗

谢谢

编辑:

这是两个不同的查询,采用相同的方法:

SELECT  user_seeks * avg_total_user_cost * ( avg_user_impact * 0.01 ) AS [index_advantage] ,
        dbmigs.last_user_seek ,
        dbmid.[statement] AS [Database.Schema.Table] ,
        dbmid.equality_columns ,
        dbmid.inequality_columns ,
        dbmid.included_columns ,
        dbmigs.unique_compiles ,
        dbmigs.user_seeks ,
        dbmigs.avg_total_user_cost ,
        dbmigs.avg_user_impact
FROM    sys.dm_db_missing_index_group_stats AS dbmigs WITH ( NOLOCK )
        INNER JOIN sys.dm_db_missing_index_groups AS dbmig WITH ( NOLOCK )
                    ON dbmigs.group_handle = dbmig.index_group_handle
        INNER JOIN sys.dm_db_missing_index_details AS dbmid WITH ( NOLOCK )
                    ON dbmig.index_handle = dbmid.index_handle
WHERE   dbmid.[database_id] = DB_ID()
ORDER BY index_advantage DESC ;
二号

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT TOP 20 
ROUND(s.avg_total_user_cost * 
s.avg_user_impact 
* (s.user_seeks + s.user_scans),0) 
AS [Total Cost]
, d.[statement] AS [Table Name]
, equality_columns
, inequality_columns
, 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
ORDER BY [Total Cost] DESC

连接表中的两个字段都是其他表的外键。在外键上建立索引通常是个好主意,因此在
(用户id,状态id)
上设置聚集键和在
(状态id,用户id)
上设置非聚集键都是个好主意

status
表或
user
表中的
delete
必须检查
statusToUser
中是否存在行,并且如果您拥有的唯一索引是
(user\u id,status\u id)
user中的
delete
可以使用主键,但是
status
中的delete必须对
statusToUser
进行聚集索引扫描,以验证其中没有与要删除的行匹配的行


查询中
status
上的谓词也是如此。
(user\u id,status\u id)
上的主键没有任何帮助,您可以通过聚集索引扫描而不是潜在的搜索,或者可能需要执行昂贵的排序操作

那么,您的查询是什么样子的,即您需要添加此索引?您是否尝试在测试系统上添加索引以查看是否存在性能差异?如果您不确定需要哪些索引,为什么不运行ms sql profiler,在执行查询时记录所有查询,并使用这些transactions.rc文件运行数据库优化器工具(使用优化配置文件)。它分析你的陈述,并建议在你的数据库上设置什么索引和统计数据。如果你已经在
(user\u id,status\u id)
(按此顺序)上有了索引,那么只在
(user\u id)
上有一个单独的索引对你没有任何好处。这些建议需要谨慎对待——它们并不完美!有时,他们会建议一个你已经拥有的索引——或者像这里这样:一个真正毫无意义的索引。将这些作为提示-但不要盲目地做DMV建议的一切…@steoleary我在两个不同的数据库中对两个查询进行了dome测试和比较运行了查询度量时间,我必须指出,通过在两个列中添加非聚集索引,它有了很大的改进,但我认为这是一种潜在的索引重复,但这是另一个问题的主题。:)