Oracle中间连接表大小

时间:2010-04-20 15:13:45

标签: sql oracle join performance

当我们加入2个以上的表时,oracle或者任何数据库决定加入2个表并使用结果与后续表连接。有没有办法确定中间连接大小。我对oracle特别感兴趣。我知道的一个解决方案是在sqldeveloper中使用具有LAST_OUTPUT_ROWS列的Autotrace。但是对于由pl / sql和其他方法执行的查询,oracle是否在某些表中记录了中间连接大小?

我问这个是因为最近我们遇到了一个问题,因为有人放弃了统计数据并且无法重新生成它,当我们发现oracle形成了一个1.8亿行的中间表,然后到达6行的最终结果查询很慢。

1 个答案:

答案 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,估算记录数为100T100,000,000,000,000条记录)