3

複数列の主キーの最初のフィールドに個別の単一列のインデックスを追加するのは冗長ですか?テーブルのサイズと比較した、その最初の列の一意の値の相対的な量に依存しますか?

私の具体的なシナリオは、2列と3列の主キーを使用して、適度なサイズのテーブル(20k〜500k行)をいくつか作成することです。これらのテーブルの最初の列は、特定のビジネスアクティビティ(ここでは単に「アクティビティ」と呼びます)に対応する整数であり、2番目の列は製品ID(実際にはUPC)またはビジネスロケーション識別子のいずれかです。

-- Activity - upc table: entire table is a two-column primary key
CREATE TABLE activity_upc (
    activity_id int NOT NULL,
    upc_id dec(18,0) NOT NULL,
    CONSTRAINT PRIMARY KEY PK_activity_upc CLUSTERED ( activity_id, upc_id )
) 

-- One of several transaction tables, unique by activity, location, and date
-- (date in SQL server is a 3-byte integer)
CREATE TABLE activity_stuff (
    activity_id int NOT NULL,
    location_id smallint NOT NULL,
    transaction_date date NOT NULL,
    [ other columns ],
    CONSTRAINT PRIMARY KEY PK_activity_stuff CLUSTERED ( 
        activity_id, location_id, transaction_date )
)

数百の一意のロカトンID、数千の一意のアクティビティID、および100万を超える一意のUPCがあります。location_idだけでクエリを実行することが非常に多いため、にインデックスがありますlocation_id単一列フィルターとしても頻繁に使用されるactivity_idに個別のインデックスを追加すると、役立つでしょうか、それともばかげて冗長でしょうか。

4

2 に答える 2

2

冗長です。インデックスを追加/削除して結果を比較することで簡単に確認できexplainます。一方、複合キーの 2 番目の列については、追加のインデックスが役立ちます。

于 2012-10-31T15:52:10.003 に答える
1

はい、インデックスキーの左ベースのサブセットは一般的に冗長です。

インクルード列を組み合わせることもできます。インクルード列の順序は重要ではありません。

例えば:

インデックス1-列F、W、B

インデックス2-列F、W; Xを含める

インデックス3-列F; Eを含める

解決:

ドロップインデックス1、2、および3

新しいインデックス4-列、F、W、B; E、Xを含める

于 2012-10-31T16:04:15.430 に答える