SQL Server中复杂主键上的表索引
我的数据库中有以下表格SQL Server中复杂主键上的表索引,sql,sql-server,Sql,Sql Server,我的数据库中有以下表格 使用者 地位 状态选择器 statusToUser用作其他两个之间的链接表,用于多对多关系 表定义如下所示: 用户Id 身份证 这些列是表的主键,并且有一个单独的索引来保存这两个列,但是当对“缺少的查询”运行查询优化时,我在列表中得到了添加另一个索引的建议 问题是,我真的需要在该列上添加另一个索引吗 谢谢 编辑: 这是两个不同的查询,采用相同的方法: SELECT user_seeks * avg_total_user_cost * ( avg_user_imp
- 使用者
- 地位
- 状态选择器
- 用户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测试和比较运行了查询度量时间,我必须指出,通过在两个列中添加非聚集索引,它有了很大的改进,但我认为这是一种潜在的索引重复,但这是另一个问题的主题。:)