3

合計最大サイズが8kの境界を大幅に超える列が多数あるテーブルがあります。このテーブルには、基本的にそれがどのタイプのオブジェクトであるかを示すModuleID列が含まれています(心配しないでください-私はこれを設計していません)。そのうち15の異なる値が存在する可能性があります。そして、それは、IDENTITY(1,1)でもあり、SQLServerによってインクリメントされるpropertyIDと呼ばれる一意の列を持っています。ModuleIDにはクラスター化されたインデックスがあり、この値はselectで常に認識され、更新ではpropertyIDが使用されます(moduleIDがここでスコープ内にあることはめったにありません)。テーブルには数百万行が含まれています。

INSERTに関して、私の質問は次
のとおりです。a)一意でないクラスター化されたキーは、SQL ServerがKEY(行)ロックの代わりに排他的なページレベルのロックを保持する可能性を高めますか?
b)クラスター化されたキーをインクリメントされる一意のpropertyIDに変更すると、SQL Serverは代わりに排他的なKEYロックを保持できるようになり、これらは常にクラスター化されたインデックスの最後のページに移動しますか?

テーブルが(一部のインストールでは)moduleIDでパーティション化されているという事実は、あなたの答えを変えますか?

4

1 に答える 1

1

これを裏付ける確固たる事実や数字はありませんが、私の経験と知識から言えば、「いいえ」と言えます。

驚いた??

説明させてください。SQL Server のクラスタリング インデックスは一意である必要があります。はい、そうしなければなりません。いいえ、一意にする必要はありません。そうしないと、SQL Server 自体が、クラスタリング インデックスで競合する行に 4 バイトの "一意化子" (INT) を追加することで対応します。

したがって、最終的には、常に一意のクラスタリング キーを保持します。これは、実際のデータへの「物理的な」ポインターであるため、そうする必要があります。非クラスター化インデックスがそのデータを迅速かつ効率的に見つけるにはどうすればよいでしょうか。ある種のユニークな「ポインター」ではありませんか??

したがって、少し不注意で、一意であることが保証されていないクラスタリング キーの列 (または列のセット) を選択した場合でも、SQL Server はそれらが一意であることを最終的に確認します。これらの一意化子に必要なストレージ。

そのため、常に一意のクラスタリング キーが残っているため、ページ レベルのロックの可能性に違いはありません。

于 2010-09-27T21:40:56.820 に答える