ORA-01652为什么未使用的行限制器可以解决这个问题?

问题描述 投票:1回答:1

如果我在没有行限制器的情况下运行查询,则会收到ora-01652告诉我我没有临时表空间。 (我不是DBA,并且我当然不完全理解此错误。)如果我添加<1000000000的rownum,它会在几秒钟内运行(是的,限于十亿行)。我的内部查询仅返回约1,000行。多么巨大的行限制器(从未达到)如何使此查询运行?有限查询和无限查询之间应该没有区别,不是吗?

select
    col1,
    col2,
    ...
from
        (
            select
                col1, col2,...
            from table1 a
                join table2 b-- limiter for performance
                     on a.column= b.column
                     or a.col= b.col
            where
                filter = 'Y'
                and rownum <1000000000  -- irrelevant but query doesn't run without it.
    )  c
join table3 d
        on c.id  = d.id
sql oracle temp
1个回答
0
投票

我们需要查看具有和不具有rownum条件的查询的执行计划。但例如,添加“ rownum” can更改执行计划

SQL> create table t as select * from dba_objects
  2  where object_id is not null;

Table created.

SQL>
SQL> create index ix on t ( object_id );

Index created.

SQL>
SQL> set autotrace traceonly explain
SQL> select * from t where object_id > 0 ;

Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 82262 |    10M|   445   (2)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    | 82262 |    10M|   445   (2)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("OBJECT_ID">0)

SQL> select * from t where object_id > 0  and rownum < 10;

Execution Plan
----------------------------------------------------------
Plan hash value: 658510075

---------------------------------------------------------------------------------------------
| Id  | Operation                            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |      |     9 |  1188 |     3   (0)| 00:00:01 |
|*  1 |  COUNT STOPKEY                       |      |       |       |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| T    |     9 |  1188 |     3   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN                  | IX   |       |       |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

这是一个简单的例子,但是您可以通过联接等获得类似的结果,特别是,“ rownum”子句可能禁止将最里面的联接折叠为最外面的联接,从而产生不同的计划。

© www.soinside.com 2019 - 2024. All rights reserved.