0

説明が見つからない状況があります。ここにあります。(オリジナルは非常に大きいため、仮定の情報を使用します。)

私はテーブルを持っているとしましょう:

table_a
-------------
name
last name
dept
status
notes

また、このテーブルには挿入時にトリガーがあり、情報に対して多くの検証を行い、検証の結果に従って新しいレコードのステータス フィールドを変更します。検証の一部は次のとおりです。

- check for the name existing in a dictionary
- check for the last name existing in a dictionary
- check that fields (name,last name,dept) aren't already inserted in table_b
- ... and so on

問題は、クエリを介してテーブルに挿入すると、次のようになります

insert into table_a 
(name,last_name,dept,status,notes) 
values
('john','smith',1,0,'new');

すべての検証プロセスを実行し、ステータス フィールドを更新し、テーブルにレコードを挿入するのに 173 ミリ秒しかかかりません。(検証プロセスはインデックスを介してすべての検索を行います)

しかし、SQLloader を介してこれを試し、5000 レコードのファイルを読み取ると、149 レコードを検証して挿入するのに 40 分ほどかかります (もちろん、私はそれを殺しました...)

そこで、トリガーを無効にしてデータを読み込んでみました(速度を確認するため)。すべてのレコードと同じように 10 秒以内に読み込まれることがわかりました。

私の質問は、このプロセスを改善するために何ができるでしょうか? 私の唯一の理論は、データベースが非常に高速に読み込まれ、トリガーの多くのインスタンスが起動されるため、データベースが飽和状態になる可能性があるということですが、実際にはわかりません。

私の目的は、情報を含む約 60 個のファイルをロードし、トリガーのプロセスを通じてそれらを検証することです (ただし、他のオプションを試してみるつもりです)。

あなたが提供できる助けを本当に感謝します!!

補完 - ------------------------------------------------ --------------------------------

答えてくれてありがとう、今私はこれについてすべて読んでいます。この部分で私を助けてくれることを願っています。必要な機能のいくつかを説明させてください(そして、トリガーを使用したので、他に何も考えられませんでした)

したがって、テーブル データには次の (重要な) フィールドが含まれます。

pid name lastname birthdate dept cicle notes

データはこのようになります

name lastname birthdate dept

これで、トリガーはデータに対して次のことを行います。

  1. pid を計算する関数を呼び出します (名前、姓、生年月日に基づいてアルゴリズムで計算されます)

  2. 辞書の名前をチェックする関数を呼び出します (これは、私の辞書には単一の名前があるためです。つまり、人の名前が john aaron smith jones の場合、関数は john aaron を 2 つに分割し、辞書で john と aaron を検索します。別のクエリ、それが私が外部キーを使用しなかった理由です[ジョン・アーロン、ジョン・アラン、ジョン・ピアス..などの多くの組み合わせを避けるため]) --->これを変更せずにキーを使用して実装する方法にちょっとこだわった辞書...おそらくCHECK?を使用して、姓の外部キーを使用することをお勧めします。

  3. 部門と現在の日付に従って、別のテーブルから cicle を取得します (同じ部門の別の cicle でテーブルに 2 回表示される可能性があるため) ---> この cicle 値をより効率的な方法で取得するにはどうすればよいですか?正しい検索を行いますか?

  4. そして最後に、このすべての検証が完了した後、どの検証が満たされていないか (フィールド ノート) を正確に知る必要があるため、トリガーは失敗した検証のすべての文字列を次のように連結します。

    lastname not in dictionary, cannot calculate pid (invalid date), name not in dictionary

制約チェックが満たされていない場合、制約に失敗したというエラー メッセージが表示された別のテーブルにレコードを挿入することしかできないことはわかっていますが、それでは検証が 1 つしか残されません。よろしいですか? しかし、それらすべてを検証し、レポートを他の部門に送信して、データを確認し、必要なすべての調整を行う必要があります。

とにかく、これが今の私の状況です。可能性を探り、全体的なプロセスについていくつかの光を共有できることを願っています。お時間をいただきありがとうございます。

4

1 に答える 1