テーブルの先頭にすべての主キー列があることは影響しますか?
部分的なインデックスの読み取りには、述語の照合のために行全体をバッファー プールに取り込むテーブル スキャンが含まれる可能性が高いことを知っています。テーブルの上部に主キーを配置することで得られるパフォーマンスの向上を知りたいです。
テーブルの先頭にすべての主キー列があることは影響しますか?
部分的なインデックスの読み取りには、述語の照合のために行全体をバッファー プールに取り込むテーブル スキャンが含まれる可能性が高いことを知っています。テーブルの上部に主キーを配置することで得られるパフォーマンスの向上を知りたいです。
Oracle では、テーブルの列の順序は一般にパフォーマンスにほとんど影響しません。
その理由は、通常、行のすべての列が 1 つのブロックに含まれており、ブロック内の行の最初の列と最後の列を見つける時間の差が、ブロックを見つけて読み取るのに比べて非常に小さいためです。
さらに、行を読み取るためにデータベース ブロックに到達すると、主キーが最も重要な列ではない場合があります。
列の順序が影響を与える可能性があるいくつかの例外を次に示します。
NULL
。そのため、多くのNULL
値を含む列は、可能であれば行の最後に残すのが最善であり、スペースの使用量を減らして IO を減らします。一般に、他の NULL 列はそれぞれ 1 バイトを使用するため、節約されるスペースが小さいため、影響は最小限に抑えられます。少なくともSQLServerでは、テーブル内の列の順序(主キーかどうか)に基づくパフォーマンス上の利点はありません。リストの一番上に主キー列を配置することの唯一の利点は、組織化です。これらの列がId、FirstName、LastName、Address1、Address2、City、State、Zipのテーブルを持つようなものです。Address2、State、Firstname、Id、Address1、Lastname、Zip、Cityよりもこの順序でたどる方がはるかに簡単です。OracleやDB2についてはよくわかりませんが、同じだと思います。
DB2 では (他のデータベース マネージャー システムに関する回答は回答を確認する必要があると思います)、変更の少ない列は各行の先頭に配置する必要があります。更新を実行すると、最初に変更された列から最後までかかるためです。行の、それをトランザクション ログに書き込みます。
更新操作にのみ影響し、挿入、削除、または選択には問題はありません。また、最後の列だけを書き込む必要がある場合は、書き込まれる情報が少なくなるため、IO が少し減少するという影響があります。これは、多数のレコードを持つ大きな行を持つテーブルでいくつかの小さな列に対して更新を実行する場合に重要になる可能性があります。最初の列が変更されると、DB2 は行全体を書き込みます。
更新ロギングを最小限に抑えるための列の順序: http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/c0024496.html
(ORACLEの場合)すべての主キー列は、たとえ1つしかない場合でも、行の最初または最初の数列の中にあるべきだと言うのは公正ですか。さらに、行の END でタグ付けすることは、特に一連の null の可能性がある/可能性のある一連の属性フィールドの後で、悪い習慣ですか?
したがって、次のような行:
pkcol(s)、att1、att2、att3、varchar2(2000)
上記のすべての理由から、
att1、att2、att3、varchar2(2000)、pkcol(s)
なぜ私は尋ねているのですか?判断しないでください。ただし、いくつかのテーブルの PK を単純化しており、開発者は行の最後に新しい GUID pk (判断しないでください #2) を喜んでタグ付けしています。私はこれに悩まされていますが、私の恐れを正当化するためにフィードバックが必要です. また、これは SQL Server にとってまったく問題になりますか?