1

多数の行と多数のインデックスを持つテーブル (データ ウェアハウスのファクト テーブル) に整数列を追加したいと考えています。

行幅をできるだけ狭く保つために、このテーブルのすべての列は非ヌルとして定義されています。したがって、新しい列をデフォルトのゼロで null にしないでください。

経験上、この列を追加するにはしばらく時間がかかります。おそらく、データベースは値が入力された新しい列ですべての行を書き換える必要があるためです。また、これにはおそらく、クラスター化インデックスとすべての非クラスター化インデックスの更新が含まれます。

したがって、列を追加する前にすべてのインデックスを削除してから、すべてを再作成する必要があります。または、これを行う簡単な方法はありますか?

また、null 許容の列を追加する方がはるかに高速である理由がよくわかりません。行ごとに追加の Is Null ビットを反転させてレコードを再書き込みする必要がないのはなぜですか。

4

3 に答える 3

4

クラスター化インデックスを更新する必要があります。はい、これテーブル データです。

しかし、クラスター化されていないインデックスを更新する必要がある理由がわかりません。新しい列は、クラスター化されていないインデックスのメンバーにはなりません。

また、このシナリオでインデックスを削除して再作成することがどのように役立つかわかりません。別のテーブルまたはデータベースから数百万の既存の行を一括ロードしている場合-はい、(INSERT がはるかに高速であるため)高速である可能性があります-しかし、列を追加しても、インデックスや制約が存在することに実際には悩まされません。思わない。

マルク

于 2009-04-16T15:23:26.630 に答える
0

SQL Serverは、行指向のデータベースです。これは、列指向データベースとは対照的です。これは、SQL Serverでは、特定の行のすべてのデータが一緒にディスクに保存されることを意味します。例を見てみましょう:

FirstName、MiddleInitial、LastNameの3つの列を持つCustomerテーブルがあるとします。次に、このテーブルにJabba T. Hutt、Dennis T. Menace、GeorgeW.Bushの3つのレコードがあるとします。

行指向のデータベース(SQL Serverなど)では、レコードは次のようにディスクに保存されます。

ジャバ、T、ハット; デニス、T、脅威; ジョージ、W、ブッシュ;

対照的に、列指向データベースは、次のようにレコードをディスクに保存します。

ジャバ、デニス、ジョージ; T、T、W; ハットメナス、ブッシュ;

行ではなく列がグループ化される場合。

これで、行指向データベース(SQL Serverなど)のテーブルに列を追加する場合、各列の新しいデータを既存の行と一緒に挿入する必要があり、多くの読み取り/書き込みが必要な行がシフトされますオペレーション。したがって、デフォルトで「Mr」になっている顧客プレフィックスの新しい列を挿入すると、次のようになります。

ジャバさん、Tさん、ハットさん。デニスさん、T、メナス。ジョージ、W、ブッシュ氏;

ご覧のとおり、元のデータはすべて右にシフトされています。一方、デフォルトでNULLになる新しい列を挿入する場合、既存の行に新しいデータを配置する必要はありません。したがって、シフトが少なくなり、必要なディスクの読み取り/書き込み操作が少なくなります。

もちろん、これは実際にディスク上で起こっていることを単純化しすぎています。インデックスやページなどを扱うときに考慮すべきことは他にもあります。しかし、それはあなたが全体像をつかむのに役立つはずです。

明確にするために、列指向のデータベースに移行することを提案しているわけではありません。行指向の意味を説明するために、その情報をそこに配置します。

于 2009-04-16T15:17:49.810 に答える
0

「また、なぜ null 許容の列を追加する方がはるかに高速なのか、よくわかりません。行ごとに追加の Is Null ビットを反転させてレコードを再書き込みする必要がないのはなぜですか。」

null 許容列を追加しても、テーブルの定義が変更されるだけです。個々のレコードは影響を受けません。

于 2009-04-16T18:38:08.893 に答える