SQL Server中复杂主键的表索引

时间:2013-03-09 01:17:46

标签: sql sql-server

我的数据库中有以下表格

  • 用户
  • 状态
  • statusToUser

statusToUser用作其他两个之间的链接表,用于多对多关系

表定义如下:

  • USER_ID
  • STATUS_ID

这些列是表的主键,并且有一个索引可以保存它们,但是当为“缺少的查询”运行查询优化时,我在列表中得到了添加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

1 个答案:

答案 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)上的主键不会有任何帮助,您最终可以使用聚簇索引扫描而不是潜在搜索,或者可能需要进行昂贵的排序操作。