少なくともMySQLでは、varcharフィールドをデータベーステーブルの最後に列として配置する必要があることを読みました。その理由は、varcharフィールドの長さが可変であり、クエリの速度が低下する可能性があるためです。私の質問:これはMSSQL 2012に適用されますか?すべてのデータベース行の最後にすべてのテキストデータが含まれるようにテーブルを設計する必要がありますか?
2 に答える
テーブル内の列の順序は、データベース設計(エンティティ、属性、および関係)、トランザクション設計、およびクエリ設計のパフォーマンスへの影響と比較して、パフォーマンスへの影響はごくわずかです。
違いが無視できないかどうかを判断するには、実際にいくつかのテストを設定し、結果を比較する必要があります。
通常、主キーを最初の列、次に外部キー、次に自然キーと頻繁にアクセスされる列として配置します。私は通常、長い文字列を行の終わりに向けて配置します。しかし、これは必ずしもパフォーマンスの最適化ではありません。これは、私が便宜上使用しているスタイル設定であるためです。
行の多数の列がNULL可能であり、それらの列のほとんどにNULLが含まれている場合、列の順序はSQLServerの行のサイズに影響を与える可能性があります。SQL Server(Oracleなど)には、行の終わりにNULL値を含む列用にスペースが予約されていない最適化があります。行の最後の非NULL値まで、行のすべての列にいくらかのスペースが予約されています。
それからのポイントは、null許容列がたくさんある場合、最も頻繁にNULLになる列の前に、最も頻繁にNULLではない列が必要になるということです。
注:SQL Serverは、列が固定長であるか可変長であるかによって、最初にテーブル内の列を並べ替えることに注意してください。すべての固定長列が最初に格納され、次にすべての可変長列が格納されます。これらの列のセット(固定および変数)内では、列は定義された順序で格納されます。
インデックスの作成に関しては、列の順序が重要です。
インデックス キーは、インデックスの最初の列で並べ替えられ、前の列の各値内の次の列でサブ並べ替えされます。複合インデックスの最初の列は、インデックスのリーディング エッジと呼ばれることがよくあります。たとえば、次の表を考えてみましょう。
c1 c2 1 1 2 1 3 1 1 2 2 2 3 2列に複合インデックスが作成されている場合、インデックスは
(c1, c2)
次の表に示すように並べられます。c1 c2 1 1 1 2 2 1 2 2 3 1 3 2
c1
上の表に示すように、データは複合インデックスの最初の列 ( ) で並べ替えられます。最初の列の各値内で、データは 2 番目の列でさらに並べ替えられます (c2
)。したがって、複合インデックスの列の順序は、インデックスの有効性を左右する重要な要素です。これは、次のことを考慮するとわかります。
- 列の一意性
- 列幅
- 列のデータ型
SELECT * FROM t1 WHERE c2 = 12
SELECT * FROM t1 WHERE c2 = 12 AND c1 = 11
インデックスをオンに
(c2, c1)
すると、両方のクエリにメリットがあります。ただし、最初のステートメントでは でデータを並べ替える必要があるのに対し、最初に でデータを並べ替えるため、インデックス は(c1, c2)
適切ではありません。c1
SELECT
c2
出典: SQL Server 2008 Query Performance Tuning Distilled