Sql Oracle中间联接表大小
当我们连接两个以上的表时,oracle或任何数据库都会决定连接两个表,并使用结果连接后续的表。是否有方法确定中间联接大小。我对甲骨文特别感兴趣。我知道的一个解决方案是在sqldeveloper中使用Autotrace,它具有LAST\u OUTPUT\u ROWS列。但是对于pl/sql和其他方式执行的查询,oracle是否在某个表中记录了中间联接大小Sql Oracle中间联接表大小,sql,oracle,join,performance,Sql,Oracle,Join,Performance,当我们连接两个以上的表时,oracle或任何数据库都会决定连接两个表,并使用结果连接后续的表。是否有方法确定中间联接大小。我对甲骨文特别感兴趣。我知道的一个解决方案是在sqldeveloper中使用Autotrace,它具有LAST\u OUTPUT\u ROWS列。但是对于pl/sql和其他方式执行的查询,oracle是否在某个表中记录了中间联接大小 我问这个问题是因为最近我们遇到了一个问题,因为有人删除了统计数据,无法重新生成它。当跟踪到整个过程时,我们发现oracle在得到6行的最终结果之
我问这个问题是因为最近我们遇到了一个问题,因为有人删除了统计数据,无法重新生成它。当跟踪到整个过程时,我们发现oracle在得到6行的最终结果之前形成了一个1.8亿行的中间表,查询速度非常慢。oracle可以具体化表联接到会话的临时段集中 由于它是一个一次性表,在查询完成后将被删除,因此不会存储其统计信息 但是,您可以通过构建查询计划并查看相应操作的
行
参数来估计其大小:
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\u TEMP\u 0FD9D6604\u 2660595
,估计的记录计数为100T
(1000000000000
记录)