9

少なくともMySQLでは、varcharフィールドをデータベーステーブルの最後に列として配置する必要があることを読みました。その理由は、varcharフィールドの長さが可変であり、クエリの速度が低下する可能性があるためです。私の質問:これはMSSQL 2012に適用されますか?すべてのデータベース行の最後にすべてのテキストデータが含まれるようにテーブルを設計する必要がありますか?

4

2 に答える 2

9

テーブル内の列の順序は、データベース設計(エンティティ、属性、および関係)、トランザクション設計、およびクエリ設計のパフォーマンスへの影響と比較して、パフォーマンスへの影響はごくわずかです。

違いが無視できないかどうかを判断するには、実際にいくつかのテストを設定し、結果を比較する必要があります。

通常、主キーを最初の列、次に外部キー、次に自然キーと頻繁にアクセスされる列として配置します。私は通常、長い文字列を行の終わりに向けて配置します。しかし、これは必ずしもパフォーマンスの最適化ではありません。これは、私が便宜上使用しているスタイル設定であるためです。

行の多数の列がNULL可能であり、それらの列のほとんどにNULLが含まれている場合、列の順序はSQLServerの行のサイズに影響を与える可能性があります。SQL Server(Oracleなど)には、行の終わりにNULL値を含む列用にスペースが予約されていない最適化があります。行の最後の非NULL値まで、行のすべての列にいくらかのスペースが予約されています。

それからのポイントは、null許容列がたくさんある場合、最も頻繁にNULLになる列の前に、最も頻繁にNULLではない列が必要になるということです。

注:SQL Serverは、列が固定長であるか可変長であるかによって、最初にテーブル内の列を並べ替えることに注意してください。すべての固定長列が最初に格納され、次にすべての可変長列が格納されます。これらの列のセット(固定および変数)内では、列は定義された順序で格納されます。

于 2012-09-04T21:57:54.913 に答える
3

インデックスの作成に関しては、列の順序重要です。

インデックス キーは、インデックスの最初の列で並べ替えられ、前の列の各値内の次の列でサブ並べ替えされます。複合インデックスの最初の列は、インデックスのリーディング エッジと呼ばれることがよくあります。たとえば、次の表を考えてみましょう。

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)適切ではありません。c1SELECTc2

出典: SQL Server 2008 Query Performance Tuning Distilled

于 2012-09-06T14:17:40.647 に答える