我手头有以下问题。我有18个非常大的Oracle表;每个行的计数在2到15百万之间变化,另外每个表有大约450列。表具有相同的列类型和结构。我需要的是,一旦它们作为其他操作的结果生成,就将这些表统一到一个非常大的单个表中。在生成每个表时,我使用以下优化:
1)我为每个表使用Create Table命令,提示“NOLOGGING PARALLEL 32 COMPRESS FOR QUERY HIGH”。我们的数据库服务器支持最多32个单元的并行性。
2)在创建每个表之后,我在该表上运行“dbms_stats.gather_table_stats”以优化执行路径。
现在,我想到的最基本的事情是以下声明:
CREATE TABLE UNIFIED_TABLE NOLOGGING PARALLEL 32 COMPRESS FOR QUERY HIGH AS
(SELECT * FROM TABLE_0
UNION ALL
SELECT * FROM TABLE_1 ...
UNION ALL
SELECT * FROM TABLE_17
)
此命令看起来不像它会在一小时内完成;它一直在运行和运行,所以我需要一种更有效的方式。
目前我脑子里有以下内容:我会在开头生成最终表格作为TABLE_0的副本。然后我将从应用程序到数据库服务器进行17次额外的并行调用,每个调用包含以下命令:
INSERT INTO FINAL_TABLE
SELECT * FROM TABLE_i
我希望由于数据库服务器支持并行性,Oracle将优雅地处理来自不同INSERT INTO语句的并行插入到同一个表中。
这是一个很好的策略吗?如何以最佳方式优化此统一任务,还有其他更好的选择吗?
答案 0 :(得分:3)
如果每个表数据(id)都在不同的范围内,请创建一个空分区表,其结构与17个表相同。为与每个表对应的范围创建空分区。然后使用适当的分区SWAP / EXCHANGE表。
这就是DDL会非常快。
如果数据不是“范围”,请添加一列作为分区键(例如table_no)。
答案 1 :(得分:1)
您是否考虑过分区交换?
如果您不再使用18个表格,这将有效。 在这种情况下,您将截断最终表,并使用相应的table_XX切换空分区。