2011-10-18 13 views
6

URLを保持する列にインデックスを配置しようとしています。 URLの最大長は2000文字を超えるので、データ型をNVARCHAR(3000)に設定しました。私がこれをしたとき、私はエラーThe total size of an index or primary key cannot exceed 900 bytesを得ました。 URLでレコードを検索する必要がある可能性があるため、URL欄にインデックスが必要です。この制限を回避する方法はありますか?SQL Server:インデックスまたはプライマリキーの合計サイズは900バイトを超えることはできません。

+0

これは本当に私にとって非常に効率的に聞こえません。実際、それは管理するDBエンジンの完全な悪夢のように聞こえる。 URLで検索する必要があることを確立しましたか?この検索は遅くなるでしょうか?テキスト検索は、かなり素早く知ることができます。また、URLをビットに分割し、それらのビットのうちの1つのみ(最も変化の大きいビット)にインデックスを付けて、そのインデックス部分をURL全体に関連付けることもできます。要するに、ここには多くの戦略があります。 – Robinson

答えて

10

URLのチェックサムの計算列を作成し、クエリでチェックサムを使用できます。チェックサムは一意ではありませんが、可能な一致の数をすばやく絞り込みます。

まず、このように、あなたのテーブルに計算列を追加します。このような

Alter Table YourTableName Add URL_HASH As CheckSum(URL) 

今すぐインデックス列:

Create Index idx_YourTableName_URL_HASH On YourTableName(URL_HASH) 

今、あなたは、インデックスが求めるでしょうクエリを書くことができますあなたが探している行を見つけよう:

Select URL 
From YourTableName 
Where URL_HASH = CheckSum(N'google.com') 
     And URL = 'google.com' 

この方法は完全一致ではうまくいくはずですes。部分一致が必要な場合は、全文検索機能を使用する方がよいでしょう。

+0

私たちはこれを実装することを決めました。 – Luke101

+0

こんにちはマストロス。ご回答有難うございます。私は多くのデータを保持するVarbinaryカラムを持っています。この列はnullでもかまいません。この列がnullでないレコードを検索するクエリがあります。あなたのチェックサムのアプローチはこの場合にも非常に便利です。 nullableカラムのチェックサムが2147483647であることを確認しました。うまくいくかもしれませんが、クエリでこの数値をハードコードするのは変です。この数値は、他のバージョンのSqlServerに移行するときも同じですか?私は一度C#でGetHashCodeメソッドを使用して足で自分自身を撃って、それは戻って別の値を返すOSによって異なります。 – Mariusz

+0

私は確かに分かりません。しかし、数値をハードコーディングする代わりに、 "チェックサム(Convert(varbinary、null))"を使用することができます。 dbバージョンで値が変更されても、それでも保護されます。 –

1

SQL Serverのフルテキスト検索は、おそらく必要なものです。

http://msdn.microsoft.com/en-us/library/ms142571.aspx

あなたは単純なインデックス対それを設定すると、いくつかのマイナーなフープを介してジャンプする必要がありますが、それは超難しいことではありません。

関連する問題