由WITH子句引起的物理读取

时间:2014-05-23 06:46:05

标签: sql oracle11g query-optimization

我有一组复杂的优化选择,遭受物理读取。没有它们,它们会更快!

这些物理读取是由于WITH子句,每个WITH子查询一个physical_read_request。它们对我来说似乎完全没用,我更喜欢Oracle将子查询结果保存在内存中,而不是将它们写入磁盘并再次读取它们。

我正在寻找一种方法来摆脱这些物理读物。

具有相同问题的简单样本是:

编辑:示例替换为不使用字典视图的简单示例。

alter session set STATISTICS_LEVEL=ALL;

create table T as
select level NUM from dual
connect by level <= 1000;

with /*a2*/ TT as (
    select NUM from T
    where NUM between 100 and 110
  )
select * from TT 
union all
select * from TT
;

SELECT * FROM TABLE(dbms_xplan.display_cursor(
  (select sql_id from v$sql
   where sql_fulltext like 'with /*a2*/ TT%'
     and sql_fulltext not like '%v$sql%'
     and sql_fulltext not like 'explain%'),
  NULL, format=>'allstats last'));

并且相应的执行计划是

SQL_ID  bpqnhfdmxnqvp, child number 0
-------------------------------------
with /*a2*/ TT as (     select NUM from T     where NUM between 100 and 
110   ) select * from TT  union all select * from TT

Plan hash value: 4255080040

---------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name                      | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  | Writes |  OMem |  1Mem | Used-Mem |
---------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |                           |      1 |        |     22 |00:00:00.01 |      20 |      1 |      1 |       |       |          |
|   1 |  TEMP TABLE TRANSFORMATION |                           |      1 |        |     22 |00:00:00.01 |      20 |      1 |      1 |       |       |          |
|   2 |   LOAD AS SELECT           |                           |      1 |        |      0 |00:00:00.01 |       8 |      0 |      1 |   266K|   266K|  266K (0)|
|*  3 |    TABLE ACCESS FULL       | T                         |      1 |     11 |     11 |00:00:00.01 |       4 |      0 |      0 |       |       |          |
|   4 |   UNION-ALL                |                           |      1 |        |     22 |00:00:00.01 |       9 |      1 |      0 |       |       |          |
|   5 |    VIEW                    |                           |      1 |     11 |     11 |00:00:00.01 |       6 |      1 |      0 |       |       |          |
|   6 |     TABLE ACCESS FULL      | SYS_TEMP_0FD9D6646_63A776 |      1 |     11 |     11 |00:00:00.01 |       6 |      1 |      0 |       |       |          |
|   7 |    VIEW                    |                           |      1 |     11 |     11 |00:00:00.01 |       3 |      0 |      0 |       |       |          |
|   8 |     TABLE ACCESS FULL      | SYS_TEMP_0FD9D6646_63A776 |      1 |     11 |     11 |00:00:00.01 |       3 |      0 |      0 |       |       |          |
---------------------------------------------------------------------------------------------------------------------------------------------------------------

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

   3 - filter(("NUM">=100 AND "NUM"<=110))

Note
-----
   - dynamic sampling used for this statement (level=2)

在每个WITH视图创建时看到(phys)Write,在第一个视图用法时看(phys)Read。我还尝试了RESULT_CACHE提示(这不反映在此示例选择中,但反映在我的原始查询中),但它也没有删除磁盘访问(这是可以理解的)。

如何摆脱物理写入/读取?

0 个答案:

没有答案