【问题标题】: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,估计记录数为100T100,000,000,000,000记录)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多