Oracle结果集:重复列消耗额外的内存?

时间:2014-11-10 10:57:45

标签: oracle oracle12c

在分析生成的SQL语句时,我问自己,如果结果中的列重复,它是否会消耗不必要的内存。该框架根据需要重复一些列。这些值是通过索引访问的,所以如果这是一个真正的问题,应该解决它。

因此,如果您确切知道,请就此问题提出您的意见。

示例:

SELECT myTable.ID, myTable.Name, myTable.ID, myTable.name FROM MyTable myTable

与之相比,此示例消耗的内存是两倍 SELECT myTable.ID, myTable.Name FROM MyTable myTable或者是内部实现的,它会将每个列虚拟映射到包含实际值的单个特定列?

问题仅适用于Oracle 12,因为它正是我们正在使用的。

1 个答案:

答案 0 :(得分:0)

它没有,这实际上很容易为自己测试。

SQL> create table foo(bar varchar2(4000));
Table created.
SQL> insert into foo(bar) values(rpad('x',4000,'x'));
1 row created.
SQL> commit ;
Commit complete.

SQL> set autotrace traceonly statistics
SQL> select bar from foo;

Statistics
----------------------------------------------------------
       ...
       4549  bytes sent via SQL*Net to client

SQL> select bar,bar from foo;

Statistics
----------------------------------------------------------
       ...
       8617  bytes sent via SQL*Net to client

SQL> select bar,bar,bar,bar from foo;

Statistics
----------------------------------------------------------
      ...
      16765  bytes sent via SQL*Net to client

现在我从未见过这个实际上很重要的场景 - 上面的测试非常极端。

话虽这么说,Oracle确实做了某种形式的压缩,但是对于(某些)情况,当相同的列在连续的行中具有相同的值时。 e.g。

SQL> select bar from foo 
     union all select bar from foo
     union all select bar from foo;

Statistics
----------------------------------------------------------
       ...
       8608  bytes sent via SQL*Net to client

(添加bar的另一个副本只会增加几个字节。)