2016-11-23 9 views
1

私はテーブルを抽出するときにこれを取得します。テーブルには、ID列(autoinc)であるID列があります。インデックスのID列または検索された列でSQLクエリを高速化しますか?

理論的には一意の読取り可能な顧客番号がありますが、これまでのところ表は適用されません。

私の顧客はIdではない顧客番号を検索しています。

私の質問は今のところ:CUSTERMERNUMBERの列にインデックスを追加する必要があります(クラスタ化/非クラスタ化の場合は?) IDフィールドが外部キーとして他のテーブルで参照されている場合

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE Customer 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [CUSTOMERNUMBER] [nvarchar](50) NULL, 
    -- other columns 

    CONSTRAINT [PK_Customer] 
     PRIMARY KEY CLUSTERED ([ID] ASC) 
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
         IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
         ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
+1

はいインデックスが役立ちます。しかし、プライマリキーはすでにクラスタ化されたインデックスであるため、クラスタ化することはできません。あなたは本当にここでnvarcharを使用する必要がありますか?あなたの顧客番号の一部としてASCII文字以外の文字を設定する予定ですか? –

+0

customernumberは "345345453543534"です。アルファベットの文字はありません。 – Elisabeth

答えて

2

は、確かにクラスタ化インデックス、およびようCUSTOMERNUMBER上の非クラスタ化インデックスを作成することを残します。

はないがちょうどCUSTOMERNUMBERに索引を作成するが、さらに行くと(インデックスが付属しています)、その上にUnique Constraintを作成することを検討します。これにより、一意のCUSTOMERNUMBERが要求されるビジネスルールが破られるのを防ぎ、さらに効率的な操作に使用できる追加情報をデータベースに提供します。

はいつものように、最初のテスト:

Alter Table Customer Add Constraint uCUSTOMERNUMBER Unique (CUSTOMERNUMBER); 

(ユニーク制約の欠点は、一意のインデックスは、それがinclude追加の列できませんを作成することである含ん有する、ユニーク次いで必要であった非場合。クラスタ化インデックスはオプションです)

+0

顧客番号を一意にすることは良いことです。顧客番号と一意の列を追加する必要はありません。 – Elisabeth

0

顧客番号に一意/非クラスタ化インデックスを作成することをお勧めします。特に、テーブルが巨大であり、DMLが多数発生している場合は、インデックスをあまりに多く作成しないように注意する必要があります。

関連する問題