0

テーブルの一意の ID フィールドを生成するシーケンスがある場合、2 つのアプローチのどちらがより効率的ですか。

  1. 挿入時にトリガーを作成し、シーケンスから nextval を取得して ID フィールドに入力します。
  2. データベースにオブジェクト (またはタプル) を挿入する前に、アプリケーション層のシーケンスで nextval を呼び出します。

編集: アプリケーションは一括アップロードを実行します。したがって、アプリが実行されるたびに数千または数百万行が挿入されると想定します。#2 で述べたように、#1 からのトリガーは、アプリ内でシーケンスを呼び出すよりも効率的でしょうか?

4

4 に答える 4

2

多数の行を挿入するため、最も効率的な方法はsequence.nextval、SQL ステートメント自体の一部として as を含めることです。つまり、

INSERT INTO table_name( table_id, <<other columns>> )
  VALUES( sequence_name.nextval, <<bind variables>> )

また

INSERT INTO table_name( table_id, <<other columns>> )
  SELECT sequence_name.nextval, <<other values>>
    FROM some_other_table

トリガーを使用すると、挿入するすべての行に対して、SQL エンジンから PL/SQL エンジンへの (およびその逆の) コンテキスト シフトが強制的に実行されます。nextval を個別に取得すると、行ごとにデータベース サーバーへの追加のラウンドトリップが強制されます。どちらも、1 回か 2 回実行する場合、特に費用はかかりません。ただし、何百万回も実行すると、ミリ秒が合計されてリアルタイムになります。

于 2012-10-17T07:13:25.793 に答える
2

パフォーマンスのみを気にする場合、Oracle では一般に、トリガーを使用するよりも、INSERT ステートメントでシーケンスを使用して ID を入力する方が少し速くなります。トリガーはオーバーヘッドを少し追加するためです。

ただし (Justin Cave が言うように)、一度に数百万行を挿入しない限り、パフォーマンスの違いはおそらく重要ではありません。テストして確認してください。

于 2012-10-17T07:11:13.953 に答える
0

キーとは何ですか?レコードを一意に識別するための1つ以上のフィールドは最終的なものであり、アプリケーションの過程で変更されないようにする必要があります。

私は技術的な鍵とビジネス上の鍵を区別します。テクニカルキーはデータベースで定義され、生成されます(シーケンス、uuidなど)。ビジネスキーは、ドメインモデルによって定義されます。

だから私は提案します

  • 常にデータベース上のシーケンス/トリガーを使用してテクニカルPKを生成します
  • アプリケーションでこのPKフィールドを使用しないでください(ヒント:getId()setId()@Deprecatedをマークしてください)
  • エンティティを一意に識別するビジネスフィールドを定義し、equals/hashcodeメソッドでこれらを使用します
于 2012-10-17T07:02:04.990 に答える
0

すでに hibernate を使用している場合は、id を使用して作成する方法を制御させて@SequenceGeneratorください@GeneratedValue。それはより透過的であり、Hibernate はそれ自体のために ID を予約できるので、手動で、またはトリガーから行うよりも効率的かもしれません。

于 2012-10-17T07:15:06.763 に答える