0

我希望您对下一个问题有所帮助。这是一个真正的问题,但我将向您展示一个示例。

我有一个视图,其组成如下

viewa =
sel * from
(
calendar_dim
inner join
(
sel * from table_a
inner join table_b
union all
sel * from table_c
inner join table_D
)
on...
)

所有表,table_a table_b table_c table_d 具有相同的 pi 和分区列(第一个分区级别是日期),统计信息是最新的。

我的问题如下:

如果我会尝试做一个查询,比如

sel *
  from viewa
 where cal_Date = '2013-05-31'
-->> the explain plan works perfect. It takes only one partition from each table and produce the result.

同样的情况发生在多个日期,/......where cal_Date in ('2013-05-31','','',.......) (它需要正确的分区数)。

但是,如果我尝试将这个视图与一个包含 10 个不同日期的表进行内部连接,我正在等待视图的每个表的 10 个分区将这个假脱机与外部表连接起来。

sel a.*
from viewa a
  inner join table_e b
   on a.cal_Date = b.cal_Date

它从视图的每个表中检索所有放大器,然后复制外部表。问题是视图内的 4 个表非常大,大约有 10 亿行。

解决方案?

我试图制作一个易失性表(其中一列 = 日期),其中仅包含我所期望的不同日期,但什么也没有。仍然是相同的行为。

4

1 回答 1

0

实际上,当您向视图添加“单表”条件时,解析器本身会根据提供的值决定分区消除。

sel * from viewa where cal_Date = '2013-05-31' 

当您有“加入条件”时,解析器无法找出另一个表中有哪些值,因此可以在运行时通过动态分区消除来增强它,但不能像上面的情况那样通过静态分区消除来增强它。

sel a.* from viewa a inner join table_e b on a.cal_Date = b.cal_Date 

看看以下短语是否出现在您的解释中“......通过动态分区消除增强加入......”。如果不尝试使用与其他表相同的分区表达式对 cal_date 上的 table_e 进行分区。它应该有帮助。

于 2013-06-19T05:00:56.617 回答