3

我的数据库中有以下表格

  • 用户
  • 地位
  • 状态到用户

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

表定义如下:

  • 用户身份
  • 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
4

1 回答 1

0

联结表中的两个字段都是其他表的外键。在外键上建立索引通常是一个好主意,因此聚集键(user_id, status_id)和非聚集键(status_id, user_id)将是一个好主意。

表中或表delete中的A必须检查是否存在行那里的行与要删除的行匹配。statususerstatusToUser(user_id, status_id)deleteuserstatusstatusToUser

查询中的谓词status也是如此。主键(user_id, status_id)不会有任何帮助,您最终可能会进行聚集索引扫描而不是潜在的搜索,或者可能需要执行昂贵的排序操作。

于 2013-03-09T09:50:40.783 回答