APPROX_COUNT_DISTINCT_DETAIL

目的

APPROX_COUNT_DISTINCT_DETAILは、exprに対して個別値を含む行の概数に関する情報を計算して、詳細と呼ばれるBLOB値を戻し、ここにはその情報が特殊な形式で含まれます。

exprでは、BFILEBLOBCLOBLONGLONG RAWまたはNCLOB以外のスカラー・データ型の列を指定できます。このファンクションでは、exprの値がNULLの行は無視されます。

通常、このファンクションはGROUP BY句とともにSELECT文で使用されます。このように使用すると、行の各グループ内のexprに対する個別値の近似カウント情報が計算され、グループごとに単一の詳細が戻されます。

APPROX_COUNT_DISTINCT_DETAILによって戻される詳細は、APPROX_COUNT_DISTINCT_AGGファンクションへの入力として使用して詳細の集計を実行したり、TO_APPROX_COUNT_DISTINCTファンクションへの入力として使用して詳細を判読可能な異なるカウント値に変換できます。これらの3つのファンクションを一緒に使用すると、リソースを大量に使用する近似カウント計算を1回実行し、生成された詳細を格納した後、これらの詳細に対して効率的に集計と問合せを実行できます。たとえば:

  1. APPROX_COUNT_DISTINCT_DETAILファンクションを使用して、個別値の近似カウント情報を計算し、生成される詳細を表またはマテリアライズド・ビューに格納します。これらは、市区町村の人口統計カウントや日次販売カウントなど、粒度の高い詳細にできます。

  2. APPROX_COUNT_DISTINCT_AGGファンクションを使用して、前のステップで取得した詳細を集計し、生成される詳細を表またはマテリアライズド・ビューに格納します。これらは、都道府県の人口統計カウントや月次販売カウントなど、粒度のより低い詳細にできます。

  3. TO_APPROX_COUNT_DISTINCTファンクションを使用して、格納した詳細値を判読可能なNUMBER値に変換します。TO_APPROX_COUNT_DISTINCTファンクションを使用すると、APPROX_COUNT_DISTINCT_DETAILファンクションまたはAPPROX_COUNT_DISTNCT_AGGファンクションによって作成された詳細値を問い合せることができます。

この項の例では、APPROX_COUNT_DISTINCT_DETAILAPPROX_COUNT_DISTINCT_AGGおよびTO_APPROX_COUNT_DISTINCTファンクションを一緒に使用して、リソースを大量に使用する近似カウント計算を1回実行し、生成された詳細を格納した後、これらの詳細に対して効率的に集計と問合せを実行する方法を示します。

APPROX_COUNT_DISTINCT_DETAIL: 例

次の文は、表sh.timesおよびsh.salesに対して、各日に販売された異なる製品の概数を問い合せます。APPROX_COUNT_DISTINCT_DETAILファンクションは、該当する製品が販売された各日について、daily_detailという詳細な情報を戻します。戻された詳細は、daily_prod_count_mvというマテリアライズド・ビューに格納されます。

CREATE MATERIALIZED VIEW daily_prod_count_mv AS
  SELECT t.calendar_year year,
         t.calendar_month_number month,
         t.day_number_in_month day,
         APPROX_COUNT_DISTINCT_DETAIL(s.prod_id) daily_detail
  FROM times t, sales s
  WHERE t.time_id = s.time_id
  GROUP BY t.calendar_year, t.calendar_month_number, t.day_number_in_month;

APPROX_COUNT_DISTINCT_AGG: 例

次の文は、APPROX_COUNT_DISTINCT_AGGファンクションを使用して、daily_prod_count_mvに格納されている日次詳細を読み取り、各月に販売された異なる製品の概数を含む集計された詳細を作成します。これらの集計された詳細は、monthly_prod_count_mvというマテリアライズド・ビューに格納されます。

CREATE MATERIALIZED VIEW monthly_prod_count_mv AS
  SELECT year,
         month,
         APPROX_COUNT_DISTINCT_AGG(daily_detail) monthly_detail
  FROM daily_prod_count_mv
  GROUP BY year, month;

次の文は、各年に販売された異なる製品の概数を含む、集計された詳細を作成することを除き、前の文と似ています。これらの集計された詳細は、annual_prod_count_mvというマテリアライズド・ビューに格納されます。

CREATE MATERIALIZED VIEW annual_prod_count_mv AS
  SELECT year,
         APPROX_COUNT_DISTINCT_AGG(daily_detail) annual_detail
  FROM daily_prod_count_mv
  GROUP BY year;

TO_APPROX_COUNT_DISTINCT: 例

次の文は、TO_APPROX_COUNT_DISTINCTファンクションを使用して、daily_prod_count_mvに格納されている日次詳細情報を問い合せて、各日に販売された異なる製品の概数を戻します。

SELECT year,
       month,
       day,
       TO_APPROX_COUNT_DISTINCT(daily_detail) "NUM PRODUCTS"
  FROM daily_prod_count_mv
  ORDER BY year, month, day;

      YEAR      MONTH        DAY NUM PRODUCTS
---------- ---------- ---------- ------------
      1998          1          1           24
      1998          1          2           25
      1998          1          3           11
      1998          1          4           34
      1998          1          5           10
      1998          1          6            8
      1998          1          7           37
      1998          1          8           26
      1998          1          9           25
      1998          1         10           38
. . .

次の文は、TO_APPROX_COUNT_DISTINCTファンクションを使用して、monthly_prod_count_mvに格納されている月次詳細情報を問い合せて、各月に販売された異なる製品の概数を戻します。

SELECT year,
       month,
       TO_APPROX_COUNT_DISTINCT(monthly_detail) "NUM PRODUCTS"
  FROM monthly_prod_count_mv
  ORDER BY year, month;

      YEAR      MONTH NUM PRODUCTS
---------- ---------- ------------
      1998          1           57
      1998          2           56
      1998          3           55
      1998          4           49
      1998          5           49
      1998          6           48
      1998          7           54
      1998          8           56
      1998          9           55
      1998         10           57
. . .

次の文は、TO_APPROX_COUNT_DISTINCTファンクションを使用して、annual_prod_count_mvに格納されている年次詳細情報を問い合せて、各年に販売された異なる製品の概数を戻します。

SELECT year,
       TO_APPROX_COUNT_DISTINCT(annual_detail) "NUM PRODUCTS"
  FROM annual_prod_count_mv
  ORDER BY year;

      YEAR NUM PRODUCTS
---------- ------------
      1998           60
      1999           72
      2000           72
      2001           71