【发布时间】:2017-11-01 06:18:07
【问题描述】:
我有一个类似的查询
select *
from small_table A
inner join huge_table B on A.DATE =B.DATE
huge_table是按DATE分区的,PK是DATE、some_id和some_other_id(所以join not是通过pk index来完成的)。 small_table 只包含几个日期。
SQL 总耗时 48 分钟
由于某种原因,解释计划给了我一个“PARTITION RANGE (ALL)”,其基数很高。看起来像访问整个表,而不仅仅是 small_table.DATE 指示的分区
如果我将 SQL 放入循环中并执行
for o in (select date from small_table)
loop
select *
from small_table A
inner join huge_table B on A.DATE =B.DATE
where B.DATE=O.DATE
end loop;
只需 2 分 40 秒(完整循环)。 有什么方法可以强制在 Oracle 12c 上进行分区修剪?
附加信息:
small_table 有 13 个不同日期的 37 条记录。 huge_table 拥有 80 亿条记录,包含 179 个日期/分区。 SQL 需要来自small_table 的一个字段,但我可以调整 SQL 使其不使用它
更新:
使用use_nl hint,现在执行计划中的基数显示更准确,执行时间从48分钟缩短到4分钟。
select /* use_nl(B) */*
from small_table A
inner join huge_table B on A.DATE =B.DATE
【问题讨论】:
-
small_table 具有可变数量的注册表。在每次执行时被截断并填充。
-
抱歉,我在编辑之前的评论时遇到了问题。 small_table 有 13 个不同日期的 37 个注册表。huge_table 有 800 万个注册表,有 179 个日期/分区。关于统计。我怎样才能得到它?
-
是的,来自 user_tables 的统计数据是正确的,有 37 个注册表。 SQL 需要 small_table 中的一个字段,但我可以调整 SQL 使其不使用。
-
抱歉无法进行聊天。
标签: oracle performance optimization partitioning oracle12c