4

SQL Serverにテーブルがあり、テーブルの最後に挿入を追加します(中央に挿入されるクラスタリングキーとは対照的です)。これは、テーブルが常に増加する列によってクラスター化されることを意味します。

datetimeこれは、列でクラスタリングすることで実現できます。

CREATE TABLE Things (
    ...
    CreatedDate datetime DEFAULT getdate(),
    [timestamp] timestamp,        

    CONSTRAINT [IX_Things] UNIQUE CLUSTERED (CreatedDate)
)

しかし、私は2つThingsが同じ時間を持たないことを保証することはできません。したがって、私の要件は、日時列では実際には達成できません。

ダミーのID int列を追加し、その上にクラスター化することができます。

CREATE TABLE Things (
    ...
    RowID int IDENTITY(1,1),
    [timestamp] timestamp,        

    CONSTRAINT [IX_Things] UNIQUE CLUSTERED (RowID)
)

しかし、私のテーブルにはすでに列が含まれていることに気付くでしょうtimestamp。単調に増加することが保証されている列。これはまさに、候補クラスターキーに必要な特性です。

したがって、テーブルをrowversion(aka timestamp)列にクラスター化します。

CREATE TABLE Things (
    ...
    [timestamp] timestamp,        

    CONSTRAINT [IX_Things] UNIQUE CLUSTERED (timestamp)
)

順序を確認するためにダミーのID 列(RowID)を追加するのではなく、intすでに持っているものを使用します。

私が探しているのは、なぜこれが悪い考えなのかという考えです。そして他にどんなアイデアが良いのか。

注:回答は主観的なものであるため、コミュニティwiki。

4

4 に答える 4

10

そこで、rowversion(別名タイムスタンプ)列でテーブルをクラスター化します。順序を確認するためにダミーのID int列(RowID)を追加するのではなく、既に持っているものを使用します。

それは最初は良い考えのように聞こえるかもしれませんが、実際にはほとんど最悪の選択肢です。なんで?

クラスタ化されたキーの主な要件は次のとおりです(より優れた詳細については、Kim Trippのブログ投稿を参照してください)。

  • 安定
  • 狭い
  • 個性的
  • 可能であれば増え続ける

あなたrowversionは安定した要件に違反しています、そしてそれはおそらく最も重要なものです。行の行バージョンは、行を変更するたびに変化します。また、クラスタリングキーがテーブル内のすべての非クラスター化インデックスに追加されるため、サーバーは非クラスター化インデックスの負荷を絶えず更新し、多くのそうする時間。

結局のところ、ダミーのID列を追加することは、おそらくあなたのケースにとってはるかに優れた代替手段です。2番目に良い選択はdatetime列ですが、ここでは、重複が発生したときにSQL Serverがエントリに「一意化子」を追加しなければならないリスクがあります。3.33msの精度では、これは間違いなく発生する可能性がありますが、最適ではありませんが、rowversionアイデアよりも間違いなくはるかに優れています...

于 2010-04-21T19:01:05.860 に答える
2

リンクから:timestamp質問で:

タイムスタンプ構文は非推奨になりました。この機能は、MicrosoftSQLServerの将来のバージョンで削除される予定です。新しい開発作業でこの機能を使用することは避け、現在この機能を使用しているアプリケーションを変更することを計画してください。

重複するrowversion値は、rowversion列がSELECTリストにあるSELECTINTOステートメントを使用して生成できます。この方法でrowversionを使用することはお勧めしません。

では、特に行が更新されると値alwsysが変化するため、一体なぜどちらかでクラスター化する必要があるのでしょうか。IDをPKとして使用し、その上でクラスター化します。

于 2010-04-21T17:42:31.190 に答える
1

あなたはすでに正しい軌道に乗っていました。作成された日付を保持するDateTime列を使用して、クラスター化されているが一意ではない制約を作成できます。

CREATE TABLE Things (
    ...
    CreatedDate datetime DEFAULT getdate(),
    [timestamp] timestamp,        
)

CREATE CLUSTERED INDEX [IX_CreatedDate] ON .[Things] 
(
    [CreatedDate] ASC
)
于 2010-04-21T17:31:41.690 に答える
0

このテーブルに多くの挿入がある場合は、すべての挿入が同じ物理ページ/インデックスページで行われるため、更新を妨げるホットスポットが作成されている可能性があります。ロック設定を確認してください。

于 2010-04-21T17:35:47.567 に答える