0

我有一个视图,它建立在具有大量数据的多个表(日常事务表)上。我有一个 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 语句花费的时间比预期的要长。谁能告诉我如何有效地检查是否至少有一条记录在视图中。

请注意::这不是重复的问题,因为我指的是 VIEW 而不是 TABLE。

4

2 回答 2

3
DECLARE
    ln_exists NUMBER;
BEGIN
      SELECT COUNT(*)
      INTO ln_exists
      FROM v_view_with_huge_data --Data is also coming from DBLink tables
 /**/ WHERE rownum <= 1 /**/

      IF ln_exists > 0
      THEN
         p_log_message('data found');
         --further processing
         ...
         ...
      ELSE
         p_log_message('no data found');
      END IF;
END
于 2013-03-23T07:03:49.530 回答
1

尽管我知道我们都这样做(我也是,尽管我知道得更好:-),但不要使用 COUNT,除非您真的需要知道给定条件存在多少行。在您的示例中,您不关心存在多少行,只存在一个或多个行。找出结果是否存在的更好方法如下:

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 回答