我的数据库中有以下表格
statusToUser用作其他两个之间的链接表,用于多对多关系
表定义如下:
这些列是表的主键,并且有一个索引可以保存它们,但是当为“缺少的查询”运行查询优化时,我在列表中得到了添加user_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 ;
2号
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
答案 0 :(得分:0)
联结表中的两个字段都是其他表的外键。在外键上建立索引通常是个好主意,因此(user_id, status_id)
上的群集密钥和(status_id, user_id)
上的非群集密钥是个好主意。
delete
表或status
表中的user
必须检查statusToUser
中是否存在行,如果唯一的索引是(user_id, status_id)
1}} delete
中的user
可以使用主键,但status
中的删除必须执行statusToUser
的聚簇索引扫描,以验证是否没有行那里匹配要删除的行。
查询中status
的谓词也是如此。 (user_id, status_id)
上的主键不会有任何帮助,您最终可以使用聚簇索引扫描而不是潜在搜索,或者可能需要进行昂贵的排序操作。