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 条件下进行扫描四,如何避免它。在 main from 子句中未选择 date_dim 表。不幸的是,我没有环境来测试这个。数据库是oracle 10g

4

3 回答 3

1

显而易见的答案是在date_dim(value). 在您这样做之前,请检查表中的行数。如果少于 100,则表扫描根本不是一件坏事。

您可以通过将其移动到 a 来避免两次包含相同的子查询cross join,例如:

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

use 可以使用 with 子句从 date_dim 中获取 key 的值,并在 where 子句中加入相同的值。这将加快您的查询获取速度,同时使用 with 子句将值存储在临时空间中。

于 2012-11-27T09:13:36.347 回答
0

正如我所说,我没有看到必要时扫描该表两次的性能问题。

查询的纯粹重写将是:

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