1

テーブルの先頭にすべての主キー列があることは影響しますか?

部分的なインデックスの読み取りには、述語の照合のために行全体をバッファー プールに取り込むテーブル スキャンが含まれる可能性が高いことを知っています。テーブルの上部に主キーを配置することで得られるパフォーマンスの向上を知りたいです。

4

4 に答える 4

4

Oracle では、テーブルの列の順序は一般にパフォーマンスにほとんど影響しません

その理由は、通常、行のすべての列が 1 つのブロックに含まれており、ブロック内の行の最初の列と最後の列を見つける時間の差が、ブロックを見つけて読み取るのに比べて非常に小さいためです。

さらに、行を読み取るためにデータベース ブロックに到達すると、主キーが最も重要な列ではない場合があります。

列の順序が影響を与える可能性があるいくつかの例外を次に示します。

  • テーブルに 255 列を超える列がある場合、行は 2 つ (またはそれ以上) のブロックに分割されます。最初の 255 列へのアクセスは、残りの列へのアクセスよりも安価な場合があります。
  • の場合、行の最後の列は 0 バイトのスペースを取りますNULL。そのため、多くのNULL値を含む列は、可能であれば行の最後に残すのが最善であり、スペースの使用量を減らして IO を減らします。一般に、他の NULL 列はそれぞれ 1 バイトを使用するため、節約されるスペースが小さいため、影響は最小限に抑えられます。
  • 圧縮が有効になっている場合、圧縮の効率は列の順序に依存する場合があります。経験則として、個別の値がほとんどない列をグループ化して、圧縮アルゴリズムによってマージされる可能性を高めることをお勧めします。
  • インデックス構成テーブル(IOT) をオーバーフロー句と共に使用する場合は、列の順序を考慮する必要があります。この句を使用すると、決定された分割列の後のすべての列が行外に格納され、それらにアクセスすると追加のコストが発生します。主キーは常に、IOT の行の先頭に物理的に格納されます。
于 2013-02-20T16:28:55.203 に答える
0

少なくともSQLServerでは、テーブル内の列の順序(主キーかどうか)に基づくパフォーマンス上の利点はありません。リストの一番上に主キー列を配置することの唯一の利点は、組織化です。これらの列がId、FirstName、LastName、Address1、Address2、City、State、Zipのテーブルを持つようなものです。Address2、State、Firstname、Id、Address1、Lastname、Zip、Cityよりもこの順序でたどる方がはるかに簡単です。OracleやDB2についてはよくわかりませんが、同じだと思います。

于 2013-02-20T16:26:57.750 に答える
0

DB2 では (他のデータベース マネージャー システムに関する回答は回答を確認する必要があると思います)、変更の少ない列は各行の先頭に配置する必要があります。更新を実行すると、最初に変更された列から最後までかかるためです。行の、それをトランザクション ログに書き込みます。

更新操作にのみ影響し、挿入、削除、または選択には問題はありません。また、最後の列だけを書き込む必要がある場合は、書き込まれる情報が少なくなるため、IO が少し減少するという影響があります。これは、多数のレコードを持つ大きな行を持つテーブルでいくつかの小さな列に対して更新を実行する場合に重要になる可能性があります。最初の列が変更されると、DB2 は行全体を書き込みます。

更新ロギングを最小限に抑えるための列の順序: http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/c0024496.html

于 2013-02-20T20:30:55.447 に答える
0

(ORACLEの場合)すべての主キー列は、たとえ1つしかない場合でも、行の最初または最初の数列の中にあるべきだと言うのは公正ですか。さらに、行の END でタグ付けすることは、特に一連の null の可能性がある/可能性のある一連の属性フィールドの後で、悪い習慣ですか?

したがって、次のような行:

pkcol(s)、att1、att2、att3、varchar2(2000)

上記のすべての理由から、

att1、att2、att3、varchar2(2000)、pkcol(s)

なぜ私は尋ねているのですか?判断しないでください。ただし、いくつかのテーブルの PK を単純化しており、開発者は行の最後に新しい GUID pk (判断しないでください #2) を喜んでタグ付けしています。私はこれに悩まされていますが、私の恐れを正当化するためにフィードバックが必要です. また、これは SQL Server にとってまったく問題になりますか?

于 2015-04-22T12:28:43.713 に答える