我运行每日报告,必须查询另一个单独更新的表。由于源表中的大量记录(每天8M +),每天都存储在其自己的分区中。该分区的标准格式为P ... 4 digit year ... 2 digit month ... 2 digit date
,因此昨天的分区为P20140907
。
目前我使用此表达式,但必须每天手动更改分区的名称:
select * from <source_table> partition (P20140907) where ....
通过使用sysdate
,toChar
和Concat
,我创建了另一个名为P_NAME2
的表,它将自动生成并更新字符串值作为我的分区名称需要阅读。现在我需要更新我的主查询,以便它执行此操作:
select * from <source_table> partition (<string from P_NAME2>) where ....
答案 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''
的查询。
它可能不太漂亮,但它适用于我必须使用的数据库。