2

对不起我的英语。我有 2 个表,都按日期间隔分区,但在不同的字段上。两个表中都有大量记录(每个分区约 100 kk)。第一个表将它的 3 个最后(按日期)分区保留在快速磁盘表空间中,其他分区在慢速磁盘表空间中。我也有一些处理数据的系统。它并行执行进程,每个进程通过 select 语句从第一个表中获取数据,并将处理后的数据放入第二个表中。所以我只需要从“快速”(!)分区中从第一个表中选择数据,然后将其放入第二个表中。但是第二个表在其他(日期也是)字段上分区。当进程并行执行时,当不同的进程试图将数据放入第二个表的同一分区时,我会遇到死锁。

好的解决方案是每个进程只从“快速”分区(但所有这些分区一次)只获取第二个表中一个分区的数据。在这种情况下,每个进程都会将数据推送到一个分区中。但我不知道该怎么做。

如果我做

select t.field1, t.field2 from (select * from FIRST_TABLE partition("P1") union all
select * from FIRST_TABLE partition("P2") union all
select * from FIRST_TABLE partition("P3")) t
where t.field3='someVal' --Indexed field in FIRST_TABLE 

OracleDB 会在 FIRST_TABLE 中的分区上使用本地索引来解决 where 子句吗?这种方式将如何影响性能?

有什么想法可以解决我的问题吗?

PS关于如何在一个选择语句中从多个分区中选择数据有很多问题,但我没有找到对我的情况有用的答案。

4

2 回答 2

5

PARTITION在查询分区表时,您几乎不想使用该子句。您几乎总是希望指定允许 Oracle 自行进行分区修剪的谓词。

SELECT t.column1, t.column2
  FROM first_table t
 WHERE t.partitioned_date_column >= <<date that delimits fast partitions>>
   AND t.column3 = 'someVal'

当您在表分区的日期列上指定谓词时,Oracle 可以自动确定需要访问哪些分区。

于 2013-10-22T17:10:07.600 回答
0

如果您尝试自己并行执行三个查询,例如同时运行,则可能会出现死锁:

insert into t2 select from t1 partition ("P1");

然后在另一个外壳/窗口/作业中:

insert into t2 select from t1 partition ("P2")

如果您查询

select *
from t1
where date_column_used_for_partition >= 3_dates_ago

Oracle 将只选择您需要且您不需要使用的三个分区UNION

通过这种方式,您可以将您的INSERT INTO... SELECT语句放在一个查询中,并且您无需担心死锁,Oracle 引擎将知道它必须在第二个表的哪个分区中插入数据,他会为您管理插入。

于 2013-10-22T17:10:47.170 回答