Sql 避免不必要的表扫描

Sql 避免不必要的表扫描,sql,oracle,Sql,Oracle,在这里我可以看到date_dim table正在做第四次扫描,在什么情况下,如何避免它。未在主from子句中选择日期尺寸表。不幸的是,我没有环境来测试这一点。数据库是oracle 10g显而易见的答案是在日期值上添加索引。执行此操作之前,请检查表中的行数。如果少于100,那么表扫描一点也不坏 通过将同一子查询移动到交叉联接,可以避免两次包含该子查询,如: use可以使用with子句从date_dim获取key的值,并将其加入where子句。 当使用with子句时,这将加快查询获取的速度,因为值存

在这里我可以看到date_dim table正在做第四次扫描,在什么情况下,如何避免它。未在主from子句中选择日期尺寸表。不幸的是,我没有环境来测试这一点。数据库是oracle 10g

显而易见的答案是在日期值上添加索引。执行此操作之前,请检查表中的行数。如果少于100,那么表扫描一点也不坏

通过将同一子查询移动到交叉联接,可以避免两次包含该子查询,如:


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

正如我所说,在必要时扫描该表两次不会出现性能问题

对查询的纯重写应该是:

from   ...
cross join
       (
       select  key 
       from    date_dim 
       where   value='01-JAN-2011'
       ) as dt1
....
where  table1.day_key >= dt1.key

但您应该对其进行测试,以避免性能受到影响。

我的问题是,在查询中,我们选择了2个值,对于这4次选择一个表,有没有办法避免它?一种选择是with子句。除此之外还有什么问题吗?有趣的问题,尽管我没有看到任何性能问题扫描维度表两次。是的,根据需要扫描两次。我为你的问题写了一个带有sql解决方案的答案。每个值只扫描一次表,但您需要控制执行计划。我将进行测试,它看起来也更好,而不是编写4个sql查询。
from   ...
cross join
       (
       select  key 
       from    date_dim 
       where   value='01-JAN-2011'
       ) as dt1
....
where  table1.day_key >= dt1.key
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';