2012-02-26 7 views
3

私は3つの列を持つテーブルを持っています:リストのID、名前と数値。 目的は、テーブルを使用して、さまざまなリストの名前の数値を取得および更新することです。sqlの文字列列のインデックスを作成するには?

問題は、sqlは可変長の文字列であるため、nameカラムでインデックスを作成することを拒否してしまうことです。

インデックスを名前で選択しないと効率が悪く、静的な長さのテキスト列を使用すると、名前がかなり長くなる可能性があるため、多くの記憶領域が無駄になります。

このテーブルとそのインデックスを作成する最良の方法は何ですか?

(SQL Server 2008を実行している)

+0

文字列はどのくらいですか?実際のエラーとは何ですか?シークをより満足させるために、インデックスの目的は何ですか? –

+1

SQL Serverのインデックスは、インデックスエントリごとに**最大900バイト**になります。文字列がそれよりも長い場合は**インデックスできません。 **あなたの正確で完全なテーブル構造**を見せてください! –

答えて

4

ntextまたはtextカラムには通常のインデックスを作成できません(あなたの名前カラムはそのタイプのものと思われます)。または、(n)varcharが900バイトを超えています。その列タイプに対してフルテキストインデックスを作成できます。

+1

"名前"は推奨されていないデータ型を使用している必要があると思われる理由はわかりません。また、 'varchar(max)'カラムにインデックスを作成しようとしましたか?ヒント:これは有効なインデックスではありません。 'varchar(max)'カラムを 'INCLUDE'カラムとして追加することはできますが、これは決して賢明ではなく、とにかく検索には役立ちません。 –

+0

私はvarchar(max)のインデックスについて間違っていました、あなたは正しいです。 – Tomek

5

あなたの文字列が長い900バイトを超える場合、それは関係なく、それが変数または固定長であるかどうかの、インデックスキーにすることはできません。

1つの考えは、計算された列を追加することによって、少なくともシークをより選択的にすることです。例えば

CREATE TABLE dbo.Strings 
(
    -- other columns, 
    WholeString VARCHAR(4000), 
    Substring AS (CONVERT(VARCHAR(10), WholeString) PERSISTED 
); 
CREATE INDEX ss ON dbo.Strings(Substring); 

今すぐ更新する行を検索するときに、あなたが言うことができます。

WHERE s.Substring = LEFT(@string, 10) 
AND s.WholeString = @string; 

これは、少なくともオプティマイザがダウンして完全一致が最も可能性が高いインデックス・ページへの検索を絞り込むのに役立ちますライブ。その長さは、似たような文字列の数とオプティマイザが単一のページを除外するのに最適なものによって異なります。また、INCLUDE句を使用するかどうかにかかわらず、インデックスの他の列の一部またはすべてを含めることを試してみることもできます(これが有用かどうかは、更新クエリのその他の機能、読み取り/書き込み比率など)。

関連する問題