【发布时间】:2013-01-16 23:30:41
【问题描述】:
我是 Oracle 新手,我必须解决这个问题。
我有一张表,里面有大约 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 小时内完成所有工作。
我没有想法,所以在我要求新机器之前,您知道在这种情况下提高性能的任何方法。
【问题讨论】:
-
索引在这里没有帮助。您正在全面扫描表格。而且我不明白该分页如何帮助您。它不会工作。
-
我认为我所做的真正优化在于查询更改。
-
抱歉,我撤回了关于分页查询的断言,它可能会起作用,但是当然你做的工作比需要的多,每次都读取第一个块。开始时你会很快,但结束时会很慢。
-
是的,我注意到了这一点;这个过程在第一页非常快,并且变得越来越慢。您有什么避免这种情况的建议吗?
-
从关系数据库获取数据花费了多少时间,插入 NoSQL 数据库花费了多少时间?您是否已对您的应用进行了概要分析?
标签: sql performance oracle select