3

データベースに次のテーブルを取得しました

  • ユーザー
  • 状態
  • statusToUser

statusToUser は、多対多の関係の他の 2 つの間のリンク テーブルとして機能します。

テーブル定義は次のとおりです。

  • ユーザーID
  • Status_Id

これらの列はテーブルの主キーであり、両方を保持する単一のインデックスがありますが、「不足しているクエリ」のクエリ最適化を実行すると、user_id に別のインデックスを追加するという提案がリストに表示されました。

問題は、すでに他のインデックスを持っているので、その列だけに別のインデックスが本当に必要ですか?

ありがとう

編集:

これらは 2 つの異なるクエリであり、同じアプローチです。

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)することをお勧めします。

テーブル内またはテーブル内のAdeleteは、の行の存在を確認する必要があります。インデックスがinのみである場合は、主キーを使用できますが、delete inは、のクラスター化インデックススキャンを実行して、行がないことを確認する必要があります。削除される行と一致するその中の行。statususerstatusToUser(user_id, status_id)deleteuserstatusstatusToUser

status同じことがクエリ内の述語にも当てはまります。オンの主キーは(user_id, status_id)役に立ちません。潜在的なシークの代わりにクラスター化インデックススキャンを実行するか、高価なソート操作を実行する必要がある場合があります。

于 2013-03-09T09:50:40.783 に答える