【问题标题】:Oracle intermediate join table sizeOracle 中间连接表大小
【发布时间】:2011-02-10 04:49:45
【问题描述】:
当我们连接超过 2 个表时,oracle 或任何数据库决定连接 2 个表并使用结果与后续表连接。有没有办法确定中间连接大小。我对甲骨文特别感兴趣。我知道的一种解决方案是在具有 LAST_OUTPUT_ROWS 列的 sqldeveloper 中使用 Autotrace。但是对于pl/sql等方式执行的查询,oracle会在某个表中记录中间连接大小吗?
我之所以问这个问题是因为最近我们遇到了一个问题,因为有人删除了统计信息并且未能重新生成它,并且在追踪时我们发现 oracle 在到达 6 行的最终结果之前形成了一个 1.8 亿行的中间表,并且查询很慢。
【问题讨论】:
标签:
sql
oracle
join
performance
【解决方案1】:
Oracle 可以在您的会话的临时段集中实现表连接的中间结果。
由于是一次性表,查询完成后被删除,所以不存储其统计信息。
但是,您可以通过为查询构建计划并查看适当操作的ROWS 参数来估计其大小:
EXPLAIN PLAN FOR
WITH q AS
(
SELECT /*+ MATERIALIZE */
e1.value AS val1, e2.value AS val2
FROM t_even e1, t_even e2
)
SELECT COUNT(*)
FROM q
SELECT *
FROM TABLE(DBMS_XPLAN.display())
Plan hash value: 3705384459
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 43G (5)|999:59:59 |
| 1 | TEMP TABLE TRANSFORMATION | | | | | |
| 2 | LOAD AS SELECT | | | | | |
| 3 | MERGE JOIN CARTESIAN | | 100T| 909T| 42G (3)|999:59:59 |
| 4 | TABLE ACCESS FULL | T_ODD | 10M| 47M| 4206 (3)| 00:00:51 |
| 5 | BUFFER SORT | | 10M| 47M| 42G (3)|999:59:59 |
| 6 | TABLE ACCESS FULL | T_ODD | 10M| 47M| 4204 (3)| 00:00:51 |
| 7 | SORT AGGREGATE | | 1 | | | |
| 8 | VIEW | | 100T| | 1729M (62)|999:59:59 |
| 9 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6604_2660595 | 100T| 909T| 1729M (62)|999:59:59 |
---------------------------------------------------------------------------------------------------------
这里,物化表称为SYS_TEMP_0FD9D6604_2660595,估计记录数为100T(100,000,000,000,000记录)