8

我是甲骨文的新手,我必须解决这个问题。

我有一张桌子,里面有大约 5.2 亿行。我必须获取所有行并将它们导入(非规范化)到 NoSQL 数据库中。

该表有两个整数字段 C_ID 和 A_ID 以及 3 个索引,一个在 C_ID 上,一个在 A_ID 上,一个在两个字段上。

我一开始就尝试过这种方式:

SELECT C_ID, A_ID FROM M_TABLE;

这从来没有在合理的时间内给我任何结果(我无法测量时间,因为它似乎永远不会完成)。

我以这种方式更改了查询:

SELECT /*+ ALL_ROWS */ C_ID, A_ID FROM (SELECT
    rownum rn, C_ID, A_ID
FROM
    M_TABLE WHERE rownum < ((:1 * :2 ) +1 )) WHERE rn >= (((:1 -1) * :2 ) +1 );

我使用 3 个线程并行运行此查询,并使用大小为 1000 的页面进行分页。

我尝试引入三个优化:

1)我在表格上创建了​​统计信息:

ANALYZE TABLE TABLE_M ESTIMATE STATISTICS SAMPLE 5 PERCENT;

2)我将表划分为 8 个分区。

3)我用并行选项创建了表。

现在我能够每秒获取 10000 行,因此整个过程大约需要 15 个小时才能完成(数据库在 4 核、8 GB 机器上运行)。

问题是我需要在最多 5 小时内完成所有工作。

我没有想法,所以在我要求新机器之前,你知道在这种情况下提高性能的任何方法。

4

4 回答 4

5

甲骨文非常聪明地告诉我们它把时间花在了哪里。您可以通过使用 Oracle 的扩展 SQL 跟踪(即 10046 跟踪)跟踪会话来做到这一点。您的查询正在从一个包含大量数据的表中提取数据。检查您的 IO 速率 (db_file_scattered_read),这可能是查询的最重要的等待事件之一。

希望能帮助到你。

于 2013-02-01T15:55:13.740 回答
5

你如何处理你的结果?它是使用 PL/SQL 直接获取到文件还是使用另一个应用程序来处理数据?是通过网络发送的吗?(这可能是唾手可得的果实)。

我问的原因是通常 a FULL SCAN(没有 ORDER BY) 会立即返回第一行。如果您将结果输出到文件,您应该会看到它立即开始填满。如果你不这样做,这意味着在段的开头有很多空白空间,这可以解释为什么查询永远不会返回(至少在合理的时间内)。

所以当你说你的查询没有返回时,我有点担心,你怎么知道?以下块是否返回?

DECLARE
  l NUMBER := 0;
BEGIN
  FOR cc IN (SELECT C_ID, A_ID FROM M_TABLE) LOOP
    l := l + 1;
    EXIT WHEN l >= 100000;
  END LOOP;
END;

如果是,则表示您的 FULL SCAN 正在处理中。通过对上述查询进行计时,您应该能够计算出完整的单个 SCAN 需要多少时间,假设该段是均匀密集的。

读取 500M 行的工作量很大,但行很小,所以如果表段压缩得很好,Oracle 应该在合理的时间内返回所有行。INSERT /*+APPEND*/例如,如果重复删除然后加载表段,则其空间配置可能会效率低下。重建表 ( ALTER TABLE MOVE) 将删除段中所有空的无用空间。顺便说一句,当您对表进行分区时,您确实重建了它,所以这可能是您的查询现在返回的原因!

无论如何,我建议您重试 FULL TABLE SCAN,可能在重建表以重置任何空白空间和高水位标记之后。迄今为止,单次全表扫描是访问大量数据的最可靠的方法(也是最有效的方法之一)。

如果需要进一步提升性能,建议看一下ROWID partitioning(DIY并行处理方案)或者内置包DBMS_PARALLEL_EXECUTE

于 2013-02-01T16:47:51.163 回答
2

尝试这可能是一个激进的解决方案,但您可以查看表压缩。在 Oracle 10g 中,这仅对只读表真正有用,因为在完成写操作时块是未压缩的。我发现压缩对于数据仓库环境中的大表很有用。

也可以只压缩某些分区,以便将数据添加到按日期分区的表的末尾,您可以压缩历史分区,同时不压缩最近的分区。

表压缩的优势在于它减少了所需的 I/O 数量,这有助于 I/O 受限的系统。我经常从表中得到 10:1 的压缩率,尽管这取决于表中存储的内容以及插入数据时使用的排序。

对于现有表,我认为您可以使用以下命令:

ALTER TABLE M_TABLE COMPRESS MOVE;

请注意,这可能有助于解决您的问题,但更改表的底层结构可能有点激烈。此外,将表重建为压缩表可能会使某些索引无效。

在 Oracle 11g 下,您还可以进行高级压缩,允许更新数据,但这涉及昂贵的许可成本。

此处有一些文档,此 PDF 文档中有更多信息

于 2013-02-01T23:06:46.433 回答
1

是的,正如 user2033072 所说,您应该使用SQL TraceTkProf了解更多关于查询的信息。您可以查看官方文档

此外,您可以更简单地使用explain plan,这样 Oracle 将显示它打算做什么。

于 2013-02-01T16:01:57.077 回答