在 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