2

この質問をより適切に表現する方法がわからないため、以前に尋ねた質問を見逃した可能性があります。これを閉じて、存在する場合は正しいものを教えてください。

私は2つの重要な列を持つテーブルを持っています(つまり、もっとたくさんありますが、この質問に関係するのは2つだけです). 最初の列は GUID (ID) で、2 番目の列は nvarchar (URL の格納) です。ID と URL の組み合わせは一意である必要があります (したがって、同じ GUID を繰り返すことができますが、各行には異なる URL があり、その逆も同様ですが、同じ GUID と URL の行が複数存在することはできません)。

現在、すべての INSERT の前に SELECT を実行して、同じ ID と URL を持つ行が存在するかどうかを確認しています。ただし、nvarchar のルックアップが遅いようです。したがって、挿入時に URL のハッシュ (SHA1) で埋められる余分な列を格納するようにテーブルを更新すると思います。今は小さいハッシュ (varbinary?) のルックアップのみを行っており、これは以前よりも大幅に高速になると思います。

SQL Server 2008 でハッシュを自動的に保存し、実際のテキストではなくそのハッシュ値に対してルックアップを行う方法はありますか? インデックスは B ツリーであると想定しているので、SQL Server が nvarchar フィールドのテキストのハッシュ値を使用して B ツリーを作成し、select が実行されたときに計算する必要があります。ハッシュを取得し、ハッシュ値を使用してツリー内でルックアップを行います。これは可能ですか?

4

3 に答える 3

3

フィールドを検索する場合(id, url)、これら2つの列にインデックスがありますか?そうでない場合は、1つ追加して、ルックアップが十分に高速化されるかどうかを確認します。

そうでない場合:はい、あなたは間違いなくこの機能を自動的に得ることができます-魔法の言葉は:計算列です。

SQL Serverでは、指定した数式に基づいて値を自動的に計算する列を作成できます。これは、単純な算術式にすることも、ストアド関数を呼び出して値を計算することもできます。

これをチェックで高速化するには、計算列を永続化できることを確認する必要があります。そうすれば、インデックスを作成することもできます。これは大規模な計算を除外します-式は明確で、簡潔で、決定論的でなければなりません。

だから、これを行います:

ALTER TABLE dbo.YourTable
  ADD HashValue AS CAST(HASHBYTES('SHA1', CAST(ID AS VARCHAR(36)) + Url) AS VARBINARY(20)) PERSISTED

これで、テーブルに新しいHashValue列が追加され(好きなように呼び出します)、その値を選択して検査できます。

次に、その新しい列にインデックスを付けます

CREATE NONCLUSTERED INDEX IX_Hash_YourTable
  ON dbo.YourTable(HashValue)

これで、ルックアップが飛んでいるはずです。

于 2010-10-21T05:08:05.443 に答える
0

挿入および更新時にハッシュを計算し、必要に応じてそれを挿入するトリガーを設定できます。

挿入を停止するという点では、それらに一意のインデックスを追加するだけです

于 2010-10-21T02:32:55.733 に答える
0

これらの 2 つの列に対してテーブルに一意の制約を設定し、try / catch ブロック内で挿入を実行できますか?

ハッシュを計算する余分な作業と、それを保存する余分なスペースを節約できます。

于 2010-10-21T01:35:07.490 に答える