web-dev-qa-db-ja.com

XMLデータ型を使用する場合

私はプロジェクトでデータベースを作成する責任があります。私たちはめったに値を持たないフィールド(10,000レコードごとに1つ)を持っているので、これをデータベースに格納するための最良の方法を模索しています。

私が見る限り、私には3つのオプションがあります:

  1. 追加の値ごとにテーブルに列を追加します
  2. 元のテーブルを参照し、値を格納する必要がある場所にのみレコードがあるリンクテーブルを追加します
  3. 元のテーブルのXMLデータ型を使用して、すべての値をこのテーブルに格納します。

検討していない他のオプションはありますか?

私はそれぞれの方法の長所と短所を調べようとしています。私の知る限りでは、1が最も簡単で、2は最小のスペースしかとれませんが、3のリソースをたくさん見つけるのに苦労しています。

12

必要なのは スパース列 および フィルターされたインデックス であり、オプション1を使用します。これらは、完全にこのシナリオで完全にサポートおよび文書化されている機能です。

SQL Serverデータベースエンジンは、列定義でSPARSEキーワードを使用して、その列の値の格納を最適化します。したがって、テーブルの任意の行の列値がNULLの場合、値はストレージを必要としません。

このシナリオでXMLソリューションがうまく機能するとは想像できません。冗長なメタデータのオーバーヘッドが大きくなり、クエリが遅くなります。

12
Gaius
  1. SQL Serverで可変長の場合、null許容列にはnoスペースが必要です。 NULLであることは NULLビットマップ に格納されます。必要に応じて filtered index を使用してインデックスを作成できるため、NULL列を無視できます。

  2. ポイント1を考慮すると、複雑さが増します。

  3. しないでください。検索、解析などが難しい:あなたは後でこれを後悔します

これはサイズにも依存します。これは数十億行のchar(1000)になりますか?または10万行のtinyint?後者がポイント2の追加された複雑さを考慮した場合、それだけの価値はありません。

5
gbn

SQL Server 2008では、スパース列を使用する追加のオプションがあります。これは、あなたが言及した状況のために特別に設計されています。

これらには、XML COLUMN_SETを使用して結合されたXMLオブジェクトとして表示したり、個別に参照したりできるため、スペースを大幅に節約できるという利点もあります。

詳細については、次のブログ記事をご覧ください。 http://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx

3
Jeff