Oracle SQL使用变量分区名称

时间:2014-09-08 11:31:39

标签: sql oracle partition

我运行每日报告,必须查询另一个单独更新的表。由于源表中的大量记录(每天8M +),每天都存储在其自己的分区中。该分区的标准格式为P ... 4 digit year ... 2 digit month ... 2 digit date,因此昨天的分区为P20140907

目前我使用此表达式,但必须每天手动更改分区的名称:

select * from <source_table> partition (P20140907) where ....

通过使用sysdatetoCharConcat,我创建了另一个名为P_NAME2的表,它将自动生成并更新字符串值作为我的分区名称需要阅读。现在我需要更新我的主查询,以便它执行此操作:

select * from <source_table> partition (<string from P_NAME2>) where ....

2 个答案:

答案 0 :(得分:1)

你工作太辛苦了。 Oracle已经为您做了所有这些事情。如果使用正确的日期范围查询表,oracle将仅在相关分区上执行操作 - 这称为修剪

我建议阅读docs

如果您仍然持怀疑态度,请查询all_tab_partitions.HIGH_VALUE以获取每个分区的高值(您创建的表格......)。

答案 1 :(得分:0)

我想我会回来分享我最终是如何解决这个问题的。源数据库习惯于跨分区泄漏日期,这就是为什么一天的查询超出单个分区的原因。我不能影响这一点,只是解决它......

begin    
execute immediate 
'create table LL_TEST as
select *
from SCHEMA.TABLE Partition(P'||TO_CHAR(sysdate,'YYYYMMDD')||')
where COLUMN_A=''Something''
and COLUMN_B=''Something Else''
';
end
;

使用PL / SQL脚本我使用TO_CHAR(sysdate,'YYYYMMDD')创建分区名称,并在其周围连接查询的其余部分。

请注意,您在where子句中搜索的值需要双撇号,以便将'Something'发送到脚本中需要''Something''的查询。

它可能不太漂亮,但它适用于我必须使用的数据库。