当我们加入2个以上的表时,oracle或者任何数据库决定加入2个表并使用结果与后续表连接。有没有办法确定中间连接大小。我对oracle特别感兴趣。我知道的一个解决方案是在sqldeveloper中使用具有LAST_OUTPUT_ROWS列的Autotrace。但是对于由pl / sql和其他方法执行的查询,oracle是否在某些表中记录了中间连接大小?
我问这个是因为最近我们遇到了一个问题,因为有人放弃了统计数据并且无法重新生成它,当我们发现oracle形成了一个1.8亿行的中间表,然后到达6行的最终结果查询很慢。
答案 0 :(得分:2)
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
条记录)