URLを保持する列にインデックスを配置しようとしています。 URLの最大長は2000文字を超えるので、データ型をNVARCHAR(3000)に設定しました。私がこれをしたとき、私はエラーThe total size of an index or primary key cannot exceed 900 bytes
を得ました。 URLでレコードを検索する必要がある可能性があるため、URL欄にインデックスが必要です。この制限を回避する方法はありますか?SQL Server:インデックスまたはプライマリキーの合計サイズは900バイトを超えることはできません。
答えて
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。部分一致が必要な場合は、全文検索機能を使用する方がよいでしょう。
私たちはこれを実装することを決めました。 – Luke101
こんにちはマストロス。ご回答有難うございます。私は多くのデータを保持するVarbinaryカラムを持っています。この列はnullでもかまいません。この列がnullでないレコードを検索するクエリがあります。あなたのチェックサムのアプローチはこの場合にも非常に便利です。 nullableカラムのチェックサムが2147483647であることを確認しました。うまくいくかもしれませんが、クエリでこの数値をハードコードするのは変です。この数値は、他のバージョンのSqlServerに移行するときも同じですか?私は一度C#でGetHashCodeメソッドを使用して足で自分自身を撃って、それは戻って別の値を返すOSによって異なります。 – Mariusz
私は確かに分かりません。しかし、数値をハードコーディングする代わりに、 "チェックサム(Convert(varbinary、null))"を使用することができます。 dbバージョンで値が変更されても、それでも保護されます。 –
SQL Serverのフルテキスト検索は、おそらく必要なものです。
http://msdn.microsoft.com/en-us/library/ms142571.aspx
あなたは単純なインデックス対それを設定すると、いくつかのマイナーなフープを介してジャンプする必要がありますが、それは超難しいことではありません。
- 1. Varchar(max)列はSQL Serverのプライマリキーにはできません
- 2. apkをビルドできません:メソッド参照の数は64Kを超えることはできません
- 3. CellListウィジェットの数は25を超えることはできません
- 4. プライマリキーは常にSQL Serverでインデックスされますか?
- 5. SQL Serverで8000バイトを超えるハッシュ処理
- 6. 私はtmpfsのサイズを超えて実行することができます
- 7. Sql Server 2008 FullTextはバックグラウンドでインデックスを作成しません。
- 8. VarChar(50)のSQL Serverインデックス - このフルテキストは?または何?
- 9. SQL ServerでROW_NUMBER()でエイリアスを使用することはできませんか?
- 10. SQL Serverのエラー: "空のオブジェクトまたは列名を使用することはできません"
- 11. SQL Server Management Studioでインデックスをテーブルに追加できません
- 12. WinRAR「合計パスとファイル名の長さは260文字を超えてはいけません」
- 13. SQL Server集計またはサブクエリを含む式で集計関数を実行できません
- 14. JDBC:コミットされたデータのサイズをバイト単位で取得することはできません
- 15. SQL Serverの "top"と反対の順序で、キー/インデックスはありません
- 16. SQL Serverはレプリケーションパブリケーションをリモートでサブスクライブまたはサブスクライブできません。
- 17. カスタムチェックボックスリストコントロールasp.netのエラー。 "startIndexは文字列の長さを超えることはできません"
- 18. SQL:プライマリキーとインデックスは正確に何をしますか?
- 19. SQL Serverエラーでデータベースを開くことができません
- 20. WCFを超えるパッケージ(datacontract)のサイズを計算しますか?
- 21. GZipInputSteam DeCompressionは、サイズが13239を超えるデータに対しては機能しませんでした。
- 22. エンティティフレームワークにプライマリキーのないテーブルを持たせることはできますか?
- 23. はImportError:名前のインデックスをインポートすることはできません
- 24. javax.jdo.JDOException:文字列プロパティファイルが長すぎます。 1000000文字を超えることはできません
- 25. なぜ「最も個別の仕事を持つ機能」の合計が100%を超えることはできませんか?
- 26. PythonのUTF8 "コーデックは72位で、バイト0xc3をデコードすることはできません:無効な継続バイト
- 27. SQLまたはC#の列を合計
- 28. 合計を稼ぐことができません - ASP.NET/VB
- 29. Javaウィンドウのコンテンツのサイズは変更されていますが、最小サイズを超えていません
- 30. SQL Server 2008 SSMSはパスワードを覚えていません
これは本当に私にとって非常に効率的に聞こえません。実際、それは管理するDBエンジンの完全な悪夢のように聞こえる。 URLで検索する必要があることを確立しましたか?この検索は遅くなるでしょうか?テキスト検索は、かなり素早く知ることができます。また、URLをビットに分割し、それらのビットのうちの1つのみ(最も変化の大きいビット)にインデックスを付けて、そのインデックス部分をURL全体に関連付けることもできます。要するに、ここには多くの戦略があります。 – Robinson