1

数十の列と多数の行を持つ非常に大きなテーブルがあります。このテーブルを FT としましょう。毎日、FT テーブルからデータを読み取り、いくつかの計算を実行し、レポートの生成に使用する小さなテーブル (テーブル FA) を更新するスクリプトを実行します。

FA を更新するクエリは次のようなものです。

INSERT INTO FA (A, B, C) 
    (SELECT sum(X), sum(x) * sum(y), sum(x) + sum(z)) group by..

頻繁に sum(x) を使用するので、sum(x)、sum(y)、sum(z) で一時テーブルを作成し、それを使用して FA テーブルを更新すると速くなりますか?

4

4 に答える 4

2

一般的な経験則として、ディスクからデータを取得するのにかかる時間は、データベースが実行する最も遅い操作です (特に大きなテーブルでは)。

これらのような比較的単純な算術演算は、比較すると無視できると思います。

于 2010-08-18T20:35:34.140 に答える
2

私が知っているすべてのデータベースは、この種の最適化されているため、値は一度だけ計算されます。

現在のクエリの実行計画と読み取り、および一時テーブルクエリに変更されたものを確認してください。

于 2010-08-18T19:59:33.713 に答える
0

この投稿に とdata-warehouseのタグを付けたことを考えるdatamartと、FT テーブルはある種の事実であり、クエリは次のようになっているとしか思えません。

select 
    CalendarMonth
  , sum(x) as Tot_1 
  , sum(x) * sum(y) as Tot_2
  , sum(x) + sum(z) as Tot_3
from FT         as f
join dimDate    as d on d.DateKey    = f.DateKey
join dimUser    as u on u.UserKey    = f.UserKey
join dimProduct as p on p.ProductKey = f.ProductKey
where CalendarYear between 2008 and 2010
  and Country = 'United States'
  and ProductCategory = 'Cool Gadget'
  and UserGender = 'Female'
group by CalendarMonth ;

これは、ファクト テーブル内のメジャーの集計がどのように見えるかです。

現在、レポートの目的で、レポートを高速化するための集計テーブル (FA) があるようです。ウェアハウスは一晩でロードされ、クエリは営業時間前の朝に時々集計を準備するため、1 日に 1 回実行されるか、少なくとも実行されると推測できます。このクエリの実行に時間がかかりすぎる場合は、集計テーブル (FA) にいくつかのキー フィールド (通常は DateKey) を追加してから、FA テーブルを定期的に更新することを検討してください。

たとえば、1 日あたりの売上が 10,000 の場合、上記のクエリの合計は各月で 300,000 行になります。集計テーブルが 1 日ごとに集計される場合、テーブルを更新するために 1 日 1 回合計 10,000 行が必要ですが、レポートには 1 か月あたり合計 30 行しか必要ありません。

要約すると、ファクト集計クエリを高速化するために、集計関数ではなく、集計される行数に注目します。また、ディメンション テーブルには、クエリの WHERE 句で指定された列にインデックスがあることを確認してください。

確かに、ここではあまりにも多くのことを想定しすぎている可能性があるため、これは役立つ場合とそうでない場合があります。

于 2010-08-19T12:14:08.453 に答える
0

以下に対してクエリをベンチマークします。

insert into fa (a, b, c)
select sum_x, sum_x * sum_y, sum_x * sum_z
  from (select sum(x) as sum_x, sum(y) as sum_y, sum(z) as sum_z
          from my_table
         group by my_grouping_columns)

私の強い疑惑は、オラクルが最初に中間セットを構築しなければならないということです - グループ化された合計 - そしてそれを最終的な結果セットに変換しなければなりません。

Oracle に中間結果セットをグローバル一時テーブルに実体化させることは、間違いなく簡単でも高速でもありません。正当な理由がないのにダイレクト パス I/O を追加している。とはいえ、中間結果セットの作成にコストがかかり、複数の挿入で使用される場合は、それを一時テーブルに実体化する価値があるかもしれません。

于 2010-08-19T04:58:10.337 に答える