在 oracle 中加入大量表

Posted

技术标签:

【中文标题】在 oracle 中加入大量表【英文标题】:joining larger volumes of table in oracle 【发布时间】:2015-04-10 07:58:06 【问题描述】:

我想在 oracle 中加入三个更大的表。 TableA 有 3.7 亿行,TableB 有 3.7 亿行,主表 TableM 有 600 000 行。 TableM 是其他两个表 TableA 和 TableB 的主表。

我的查询是这样的

Select A.MasterId, B.Date1
  FROM TableA A
INNER JOIN TableB B on B.MasterId= A.MasterId
INNER JOIN TableM M ON M.MasterId= A.MasterId

当我执行上述查询时,它需要很长时间。我想通过获取五年数据的值来使用 WHERE 子句拆分查询执行。我们总共有 25 年的数据,所以我可以执行五次以下查询并将值插入 Temp 表。

我的方法是。

方法一:

使用 UNION 运算符,我可以组合结果集并将值插入到 Temp 表中。时间太长了。

Select A.MasterId, B.Date1
  FROM TableA A
INNER JOIN TableB B on B.MasterId= A.MasterId
INNER JOIN TableM M ON M.MasterId= A.MasterId
WHERE M.Date > '01-JAN-1985' and M.Date <'01-JAN-1990'
UNION ALL
Select A.MasterId, B.Date1
  FROM TableA A
INNER JOIN TableB B on B.MasterId= A.MasterId
INNER JOIN TableM M ON M.MasterId= A.MasterId
WHERE M.Date > '01-JAN-1990' and M.Date <'01-JAN-1995'

.....

方法二:

尝试使用批量收集将 5 年的数据插入临时表,但失败了。

还有其他方法可以解决这个问题吗?

【问题讨论】:

1) 涉及的索引有哪些? 2)表是否分区? 3) 解释计划是怎样的? 4)而且不要使用PL/SQL,它会比SQL慢很多。 5) '01-JAN-1985' 不是 DATE,它是一个字符串。 6) 数据类型是什么? 你有一张小桌子吗?如果您有一张较小的桌子,您可以选择阿联酋。你能提供桌子大小吗? 嗨拉利特,感谢您的及时回复。为您的 qns 找到以下答案。 5.SELECT STATEMENT ALL_ROWS成本:2,041,664 字节:58,047,151,824 基数:14,929,823 【参考方案1】:

对这 3 个表进行完全连接会产生 8.2140E+22 条记录,这看起来像是一个笨重的大型数据集,这也是它需要很长时间的原因。 这样的选择有什么用?

对于插入,使用简单的 INSERT INTO ... SELECT ... FROM ... 性能应该比使用带有批量收集的 pl/sql 好得多。

【讨论】:

以上是关于在 oracle 中加入大量表的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle SQL Query 中加入(INNER JOIN)本地 Excel 表 - VBA

在 oracle sql 中加入更新

在 Oracle SQL SELECT 语句中加入条件

如何在oracle的sql语句中加入判断条件

仅当为输入参数找到某个元数据时,才在游标中加入 Oracle

如何在mysql查询的更新语句中加入多个表[重复]