0

巨大なデータを含む複数のテーブル (日次トランザクション テーブル) に基づいて構築された 1 つのビューがあります。このテーブルからデータを取得する 1 つの Oracle ジョブがあり、VIEW にデータが存在しない場合は、適切なメッセージがログに記録されます。

DECLARE
ln_countOfRecords NUMBER;
BEGIN
      SELECT COUNT(1)
      INTO ln_countOfRecords
      FROM v_view_with_huge_data; --Data is also coming from DBLink tables

      IF ln_countOfRecords > 0
      THEN
         p_log_message('data found');
         --further processing
         ...
         ...
      ELSE
         p_log_message('no data found');
      END IF;
END

その select ステートメントに予想以上の時間がかかっています。少なくとも 1 つのレコードが表示されているかどうかを効率的に確認する方法を教えてください。

注意してください:: これは、TABLE ではなく VIEW について言及しているため、重複した質問ではありません。

4

2 に答える 2

1

私たち全員がそうしていることは知っていますが(私もよく知っていますが、私もそうです:-)、特定の条件に対して何行存在するかを本当に知る必要がない限り、COUNTを使用しないでください。あなたの例では、いくつの行が存在するは気にしません。1つ以上存在するだけです。結果が存在するかどうかを確認するより良い方法は、次のようなものです。

DECLARE
  nField_value
  bRows_exist        BOOLEAN := FALSE;
BEGIN
  BEGIN
    SELECT some_field_from_view
      INTO nField_value
      FROM v_view_with_huge_data;

    -- Handle the case where only one row exists in the view

    bRows_exist := TRUE;
  EXCEPTION
    WHEN TOO_MANY_ROWS THEN  -- multiple rows exist in the view
      bRows_exist := TRUE;

    WHEN NO_DATA_FOUND THEN  -- no rows in the view
      bRows_exist := FALSE;
  END;

  IF bRows_exist = TRUE THEN
    p_log_message('data found');
    --further processing
         ...
         ...
  ELSE
    p_log_message('no data found');
  END IF;
END;

場合によっては、COUNT(*) を削除すると、パフォーマンスが低下していたプログラムが適切なランナーになることがわかりました。

YMMV。

共有してお楽しみください。

于 2013-03-23T23:20:07.447 に答える