1
Col 1,
col 2,
.....
.....
from 
table1,
table2
........
........
where
join conditions1
join conditions1
................
.................
and
table1.day_key >= (select key from date_dim where value='01-JAN-2011')
and table1.day_key <= (select key from date_dim where value='31-DEC-2011')
and 
table2.day_key >= (select key from date_dim where value='01-JAN-2011')
and table2.day_key <= (select key from date_dim where value='31-DEC-2011')

ここで、date_dim テーブルが where 条件でスキャン 4 を実行していることがわかります。それを回避する方法です。date_dim テーブルがメインの from 句で選択されていません。残念ながらこれをテストする環境がありません。データベースはオラクル10g

4

3 に答える 3

1

明らかな答えは、 にインデックスを追加することdate_dim(value)です。その前に、テーブルの行数を確認してください。100 未満の場合、テーブル スキャンはまったく悪いことではありません。

cross join次のようにに移動することで、同じサブクエリを 2 回含めることを避けることができます。

from   ...
cross join
       (
       select  key 
       from    date_dim 
       where   value='01-JAN-2011'
       ) as dt1
....
where  table1.day_key >= dt1.key
于 2012-11-27T09:11:50.280 に答える
1

with句を使用して、date_dimからキーの値を取得し、where句で同じものを結合できます。これにより、 with 句を使用して値が一時スペースに格納されている間、クエリのフェッチが高速化されます。

于 2012-11-27T09:13:36.347 に答える
0

私が言ったように、必要に応じてそのテーブルを 2 倍スキャンするパフォーマンスの問題は見られません。

クエリを純粋に書き直すと、次のようになります。

select 
  Col 1,
  col 2,
from 
  table1,
  table2,
  date_dim date_dim_start,
  date_dim date_dim_end
where
  join conditions1
  join conditions1 and
  table1.day_key >=  date_dim_start.key and
  table1.day_key <= date_dim_end.key and
  table2.day_key >= date_dim_start.key and
  table2.day_key <= date_dim_end.key and
  date_dim_start.value = '01-JAN-2011' and
  date_dim_end.value='31-DEC-2011';

ただし、パフォーマンスが低下しないように、テストする必要があります。

于 2012-11-27T09:35:02.033 に答える